2014-02-26 242 views
0

您好我正在尝试为Android创建一个应用程序,为了开发它,我需要浏览不同的页面,其中每个页面只有一个问题和4个答案(a,b,c,d )。为了这个任务,我为每个问题定义了4个单选按钮。我想获得的是,如果任何单选按钮被选中,其他单选按钮将被取消选中(单选按钮被选中为false)。我希望当用户进入不同页面时,可以检索到该值。我试过这段代码,但是它选择了一个答案并取消了其他选择,但它在保存单选按钮的状态方面并不奏效,即使我使用了共享首选项。保存单选按钮的状态

公共类第1页扩展活动{

RadioButton r1a , r1b , r1c , r1d ; 
Button b1n ; // this is a next-button that will navigate to page2 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_page1); 

       SharedPreferences pref ; 

    r1a = (RadioButton) findViewById(R.id.Q1a); 
    r1b = (RadioButton) findViewById(R.id.Q1b); 
    r1c = (RadioButton) findViewById(R.id.Q1c); 
    r1d = (RadioButton) findViewById(R.id.Q1d); 
    b1n = (Button) findViewById(R.id.B1n); 
    pref = getSharedPreferences("Answers", 0); 
     final Editor editor = pref.edit(); 


    r1a.setOnCheckedChangeListener (new OnCheckedChangeListener(){ 

     @Override 
     public void onCheckedChanged(CompoundButton arg0, boolean arg1) { 
      if (r1a.isChecked()){ 
      r1b.setChecked(false); 
      r1c.setChecked(false); 
      r1d.setChecked(false); 
      } 

      } 

    }); 


    r1b.setOnCheckedChangeListener (new OnCheckedChangeListener(){ 

     @Override 
     public void onCheckedChanged(CompoundButton arg0, boolean arg1) { 

      if (r1b.isChecked()){ 
      r1a.setChecked(false); 
      r1c.setChecked(false); 
      r1d.setChecked(false); 
      } 

     } 

    }); 


    r1c.setOnCheckedChangeListener (new OnCheckedChangeListener(){ 

     @Override 
     public void onCheckedChanged(CompoundButton arg0, boolean arg1) { 

      if (r1c.isChecked()){ 
      r1a.setChecked(false); 
      r1b.setChecked(false); 
      r1d.setChecked(false); 
      } 
      } 



    }); 


    r1d.setOnCheckedChangeListener (new OnCheckedChangeListener(){ 

     @Override 
     public void onCheckedChanged(CompoundButton arg0, boolean arg1) { 


       if (r1d.isChecked()){ 

      r1c.setChecked(false); 
      r1a.setChecked(false); 
      r1b.setChecked(false); 
     } 

    } 

     }); 

     // i use this to save the state , but it fails :(

     editor.putBoolean("questionA", r1a.isChecked()); 
     editor.putBoolean("questionB", r1b.isChecked()); 
     editor.putBoolean("questionC", r1c.isChecked()); 
     editor.putBoolean("questionD", r1d.isChecked()); 


     editor.commit(); 


} 


    public void move12(View view) { // instantiated when b1n is clicked 

     Intent intent = new Intent(this , P2.class) ; 
     startActivity (intent) ; 
    } 

} 

我这里有两个问题:

  • 是这段代码好吗?或者有没有更好的办法来处理选中的按钮?

  • 共享首选项不起作用,任何时候我回到page1所有单选按钮都未选中,状态无法保存。问题的原因是什么?如何解决?请给我任何帮助。

回答

0

您的代码保存状态正常。你的radioButtons没有被选中,因为在Page1中你实际上并没有从SharedPreferences中读取并设置它们的状态。你可以在的onCreate()补充一点:

r1a.setChecked(pref.getBoolean("questionA", false)); 
r1b.setChecked(pref.getBoolean("questionB", false)); 
r1c.setChecked(pref.getBoolean("questionC", false)); 
r1d.setChecked(pref.getBoolean("questionD", false)); 

首先,虽然,检查是否偏好文件是否存在,如果每个按钮的状态已保存。

0

你可以将onCheckChangedListeners截断为一个,然后有一个开关检查点击哪个RadioButton,但是你做的方式没有问题。

根据保存数据,它看起来不像你试图读取你保存的数据。首先,您应该将所有数据保存在move12方法中。其次,尝试在您的onCreate之后添加如下内容:

bool aChecked = prefs.getBoolean("questionA",false); 
if(aChecked) 
    r1a.setChecked(true); 

对于所有四个都这样做。