保存radiobuttons的状态

时间:2014-02-26 20:22:04

标签: android

您好我正在尝试为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请。

2 个答案:

答案 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);

为所有四个人做这件事。