您好我正在尝试为Android创建一个应用程序,为了开发它,我需要浏览不同的页面,其中每个页面只有一个问题和4个答案(a,b,c,d)。为此,我为每个问题定义了4个radiobuttons。我想要获得的是,如果检查了任何单选按钮,则取消选中其他单选按钮(无线电按钮检查为假)。我希望当用户访问不同的页面时,可以检索到该值。我尝试过这段代码,但是选择一个答案并取消选中其他答案时效果很好,但即使我使用了共享首选项,它也无法保存radiobuttons的状态。
公共类Page1扩展了Activity {
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,所有单选按钮都将被取消选中,状态将无法保存。问题的原因是什么?如何解决?任何ibeads请。
答案 0 :(得分: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));
首先,检查是否存在首选项文件以及是否已保存每个按钮的状态。
答案 1 :(得分:0)
您可以将onCheckChangedListeners
截断为一个,然后设置一个开关,检查哪个RadioButton
被点击,但您执行此操作的方式很好。
根据保存数据,您似乎不会尝试读取您保存的数据。首先,您应该将所有数据保存在move12
方法中。其次,尝试在onCreate
:
bool aChecked = prefs.getBoolean("questionA",false);
if(aChecked)
r1a.setChecked(true);
为所有四个人做这件事。