Android 片段问题的多个实例

Posted

技术标签:

【中文标题】Android 片段问题的多个实例【英文标题】:Multiple instances of an Android fragment issue 【发布时间】:2016-05-10 02:08:45 【问题描述】:

我无法解决以下问题:

我正在制作一个小测验 android 应用程序。我有一个 QuizActivity 和一个 QuizFragment,我在活动中构建了一个 QuizFragment 列表:

questionFragments = new ArrayList<>();
questionFragments.add(QuestionFragment.newInstance(new Question("Amai menne ...",
        new ArrayList<Answer>() 
            add(new Answer("Frak", false));
            add(new Answer("Jas", true));
            add(new Answer("Bernadette", false));
        )));

questionFragments.add(QuestionFragment.newInstance(new Question("Question 2",
        new ArrayList<Answer>() 
            add(new Answer("Answer 1", false));
            add(new Answer("Answer 2", true));
        )));

我在活动中有一个方法可以替换当前的 QuestionFragment:

private void showQuestion(int question) 
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.content_quiz_fl_question, questionFragments.get(question));
    transaction.commit();

QuestionActivity 中的回调:

@Override
public void onCorrectAnswerSelected() 
    showQuestion(currentQuestion + 1);

在我的 QuestionFragment 中,我以编程方式构建 RadioGroup (OnCreateView):

radioGroup = new RadioGroup(getContext());
radioGroup.setOrientation(RadioGroup.VERTICAL);

RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

lp.addRule(RelativeLayout.BELOW, R.id.fragment_question_tv_title);
radioGroup.setLayoutParams(lp);

for (Answer answer : question.getAnswers()) 
    RadioButton radioButton = new RadioButton(getContext());
    radioButton.setText(answer.getAnswer());
    radioButton.setPadding(0, 30, 0, 30);
    radioGroup.addView(radioButton);

我在片段的按钮上有一个监听器:

verifyAnswer.setOnClickListener(new View.OnClickListener() 
    @Override
    public void onClick(View v) 
        int checkedRadioButtonId = radioGroup.getCheckedRadioButtonId();

        if (question.getAnswers().get(checkedRadioButtonId - 1).isCorrect()) 
            //Correct
            handleSuccess();
         else 
            //Incorrect
            handleFailure();
        
    
);

现在这是我遇到问题的地方,当我回答第一个问题时,一切都按计划进行,但是当我回答第二个问题时,应用程序崩溃了。在调试的帮助下,我能够查明问题所在。 我似乎 RadioGroup “记住”了前面问题的可能答案(在这种情况下,我从第二个问题中选择了第二个选项)。您可以在下面看到选定的 radioButtonId 为 5,但我只有 2 个单选按钮:

如果有任何帮助,我将不胜感激!源码:https://github.com/Jdruwe/ElineBirthday

【问题讨论】:

以编程方式构建 UI?您确定您正在使用新片段的内容/大小范围更新导致 IndexOutOfBounds` 错误的变量? 如果这就是你的意思,我在调用片段的 newInstance 方法时传递了一个新的问题对象。 我的意思是您是否更新了重要的变量,例如checkedRadioButtonId,如果没有在适当的时间正确初始化,可能会导致错误? 看不出来,介意查一下源码吗(真的很小):github.com/Jdruwe/ElineBirthday 【参考方案1】:

显然您需要执行以下操作才能获取所选 RadioButton (How to get the selected index of a RadioGroup in Android) 的索引:

int radioButtonID = radioGroup.getCheckedRadioButtonId();
View radioButton = radioGroup.findViewById(radioButtonID);
int idx = radioGroup.indexOfChild(radioButton); 

【讨论】:

以上是关于Android 片段问题的多个实例的主要内容,如果未能解决你的问题,请参考以下文章

Android - 多个视图或运行时片段替换​​?

如何一个接一个地打开同一片段但具有不同数据的多个实例?

FragmentManager 添加多个相同 Fragment 类型的实例

Android 无法实例化一个或多个类

Android 上的 Xamarin WebView 显示多个实例

Android 使用布局作为模板创建多个布局实例