Android:保存单选按钮的状态

Posted

技术标签:

【中文标题】Android:保存单选按钮的状态【英文标题】:Android: Save State of Radio Buttons 【发布时间】:2013-01-29 15:51:39 【问题描述】:

您好,我正在尝试为 android 创建一个应用程序,为了开发它,我需要浏览不同的页面和问题。对于这个任务,我定义了一个带有一些单选按钮的单选组。我想要获得的是每个问题都回答了单选按钮,当用户浏览不同的页面时,可以检索该值。我已经尝试过这段代码,其中包括如果有一个选定的单选按钮,则没有创建新的单选按钮(单选按钮检查为假)。但是,使用此代码,总是有一个选定的答案,因此总是选择相同的单选按钮。我将不胜感激。

        radBotA.setOnCheckedChangeListener(radioCheckChangeListener);
            radBotB.setOnCheckedChangeListener(radioCheckChangeListener);
            radBotC.setOnCheckedChangeListener(radioCheckChangeListener);
            radBotD.setOnCheckedChangeListener(radioCheckChangeListener);
            radBotA.setOnClickListener(radioClickListener);
            radBotB.setOnClickListener(radioClickListener);
            radBotC.setOnClickListener(radioClickListener);
            radBotD.setOnClickListener(radioClickListener);
            if (radBotA.isChecked())
                Answers[position]="A";
                
            else if(radBotB.isChecked())
           Answers[position]="B";             
            else if(radBotB.isChecked())
                   Answers[position]="C";  
            else if(radBotC.isChecked())
                   Answers[position]="D";      
            else if(radBotD.isChecked())
                   Answers[position]="D";  
            else 
                radBotA.setChecked(false);
                radBotA.setChecked(false);
                radBotA.setChecked(false);
                radBotA.setChecked(false);
            

        bPrevious.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 

                position = position -1; 
                questions.Previous();
                currentQuestion();







            
        );
        bNext.setOnClickListener(new View.OnClickListener()
            @Override

                public void onClick(View v) 
                position = position +1;
                questions.Next();       
                currentQuestion();





            
        );

    private void currentQuestion() 
            if (position==0)
                bPrevious.setVisibility(View.GONE);
            else
                    bPrevious.setVisibility(View.VISIBLE);
                
            if (position==nPreguntas-1)
                bNext.setVisibility(View.GONE);
            else
                bNext.setVisibility(View.VISIBLE);
             
            questions.currentQuestion(this, category);
            enunciado.setImageResource(Enunciado[position]);
            pregunta.setText(questions.getPregunta());
            final RadioButton radBotA = new RadioButton(this);
            final RadioButton radBotB = new RadioButton(this);
            final RadioButton radBotC = new RadioButton(this);
            final RadioButton radBotD = new RadioButton(this);

            radBotA.setText("A. " + questions.getRespuestaA());
            radBotB.setText("B. " + questions.getRespuestaB());
            radBotC.setText("C. " + questions.getRespuestaC());
            radBotD.setText("D. " + questions.getRespuestaD());
            String nprueba = "Item " +  questions.getId() + " de "+ nPreguntas;


            NombrePrueba.setText(nprueba);
            if (radBotA.isChecked())
                Answers[position]="A";
                
            else if(radBotB.isChecked())
           Answers[position]="B";             
            else if(radBotB.isChecked())
                   Answers[position]="C";  
            else if(radBotC.isChecked())
                   Answers[position]="D";      
            else if(radBotD.isChecked())
                   Answers[position]="D";  
            else 
                radBotA.setChecked(false);
                radBotA.setChecked(false);
                radBotA.setChecked(false);
                radBotA.setChecked(false);
            
        

感谢大家的宝贵时间

编辑:

public void save()
            SharedPreferences settings = getSharedPreferences("Answers", 0); 
              SharedPreferences.Editor e = settings.edit();


            e.putBoolean("A0",radBotA.isChecked());
            e.putBoolean("B0",radBotB.isChecked());
            e.putBoolean("C0",radBotC.isChecked());
            e.putBoolean("D0",radBotD.isChecked());
            e.putBoolean("A1",radBotA.isChecked());
            e.putBoolean("B1",radBotB.isChecked());
            e.putBoolean("C1",radBotC.isChecked());
            e.putBoolean("D1",radBotD.isChecked());
            e.putBoolean("A2",radBotA.isChecked());
            e.putBoolean("B2",radBotB.isChecked());
            e.putBoolean("C2",radBotC.isChecked());
            e.putBoolean("D2",radBotD.isChecked());
            e.putBoolean("A3",radBotA.isChecked());
            e.putBoolean("B3",radBotB.isChecked());
            e.putBoolean("C3",radBotC.isChecked());
            e.putBoolean("D3",radBotD.isChecked());
public void load()
            SharedPreferences settings = getSharedPreferences("Answers", 0);
              boolean answerA0 = settings.getBoolean("A0", false); 
              boolean answerB0 = settings.getBoolean("B0", false);
              boolean answerC0 = settings.getBoolean("C0", false);
              boolean answerD0 = settings.getBoolean("D0", false);
              boolean answerA1 = settings.getBoolean("A1", false); 
              boolean answerB1 = settings.getBoolean("B1", false);
              boolean answerC1 = settings.getBoolean("C1", false);
              boolean answerD1 = settings.getBoolean("D1", false);
              boolean answerA2 = settings.getBoolean("A2", false); 
              boolean answerB2 = settings.getBoolean("B2", false);
              boolean answerC2 = settings.getBoolean("C2", false);
              boolean answerD2 = settings.getBoolean("D2", false);
              boolean answerA3 = settings.getBoolean("A3", false); 
              boolean answerB3 = settings.getBoolean("B3", false);
              boolean answerC3 = settings.getBoolean("C3", false);
              boolean answerD3 = settings.getBoolean("D3", false);

但是我不知道如何继续。我正在考虑以下代码,但它给了我错误,并且位置是“页码”:

public void Test()
        switch(posicion)
            case(0):
                if(answerA0==true)
                    e.putBoolean("A0",radBotA.isChecked());
                
            
        
    

【问题讨论】:

首先,根据您的编辑,您缺少e.commit(); 部分,应该在您完成向编辑器写入数据后放置。否则,您的数据将不会存储在SharedPreferences。如果涉及到第二部分,我真的不知道你所说的Test() 方法是什么意思。请解释一下这个Test() 方法应该做什么。 【参考方案1】:

如果我理解正确,您想在其他活动中检索一些数据。在这种情况下,最简单的方法是使用SharedPreferences

用户回答问题后(CheckBox 的检查状态正在更改)您应该将您的信息存储在SharedPreferences 中,如下所示:

  SharedPreferences settings = getSharedPreferences("Answers", 0); // first argument is just a name of your SharedPreferences which you want to use. It's up to you how you will name it, but you have to use the same name later when you want to retrieve data.
  SharedPreferences.Editor editor = settings.edit();
  editor.putBoolean("questionA", radBotA.isChecked()); // first argument is a name of a data that you will later use to retrieve it and the second argument is a value that will be stored
  editor.putBoolean("questionB", radBotB.isChecked());
  editor.putBoolean("questionC", radBotC.isChecked());
  editor.putBoolean("questionD", radBotD.isChecked());

  editor.commit(); // Commit the changes

所以现在您将这些信息存储在内部存储中。在其他活动中,您可以检索此信息:

  SharedPreferences settings = getSharedPreferences("Answers", 0);
  boolean answerA = settings.getBoolean("questionA", false); // The second argument is a default value, if value with name "questionA" will not be found
  boolean answerB = settings.getBoolean("questionB", false);
  boolean answerC = settings.getBoolean("questionC", false);
  boolean answerD = settings.getBoolean("questionD", false);

【讨论】:

谢谢 Mosquito,我会试试你的解决方案,问题是所有这些问题都是在同一个活动中回答的,所以 4 个单选按钮是相同的。 是的,他们在同一个活动中,但我在这里看不到任何问题。您可以访问这些CheckBoxes,因此您可以将它们的状态存储在SharedPreferences 中。实际上,我看到您的每个问题都包含 4 个答案(CheckBoxes)。我对吗?如果是这样,我将编辑我的答案,使其更适合您的问题。 是的,它们在同一个活动中,我不知道它是否重要,但它们不是复选框,而是单选按钮。再次打扰你 还需要更多信息 - 在一项活动中,您只有一个问题,有 4 个 RadioButtons 或在一项活动中有多个问题? 同一活动中有多个问题,每个问题有 4 个单选按钮【参考方案2】:

我正在开发相同的应用程序,解决方案是您必须根据您的问题编号存储单选按钮的状态,并且每个问题都有不同的键,如下所示:

final RadioButton rdSelection=(RadioButton)findViewById(mradioOptGroup.getCheckedRadioButtonId());
int child_index=mradioOptGroup.indexOfChild(rdSelection);

switch(mid)

    case 1: 
        sharedpreferences.putint("",child_index);
        break;
    case 2:
       sharedpreferences.putint("",child_index);
       break;

对你下一个问题的所有问题都这样做

在之前的每一个问题上,您都必须存储 mid+1 单选按钮的状态

mid 是您的问题编号

【讨论】:

【参考方案3】:

我刚刚解决了这个问题,现在我可以在每次下一次单击时保存单选按钮的当前状态,并且在每次上一次单击时我都会恢复单选状态,即使用户通过转到上一个来更改状态问题或任何问题。

【讨论】:

以上是关于Android:保存单选按钮的状态的主要内容,如果未能解决你的问题,请参考以下文章

如何保存单选按钮的状态?

如何保存单选按钮的状态?

如何在我的程序中保存一组单选按钮的状态?

颤动 - 如何在颤动中保存状态选择的单选按钮列表?

更改单选按钮选中状态时如何从单选按钮组中的单选按钮获取文本

android 编程中怎样从单选按钮获取数据