java - 如何修复 Android Activity 中的 BackStack 问题?

标签 java android android-fragments android-activity back-stack

我有一个 Activity A 加载 Fragment F 10 次;数组列表中的每个问题一次。问题是,如果我正在查看第 4 个问题并决定返回(我有一个按钮可以向后导航,另一个按钮可以向前导航),它似乎永远不会忘记那个特定的位置(第 4 个),因为到达后第 1 个问题,如果我单击“下一步”(或前进按钮),它会跳回到第 4 个问题而不是第 2 个问题。

这是加载带有新问题的新 fragment 的代码:

@Override
public void onNextQuestion(){
    Bundle bundle = new Bundle();
    Log.d("ANSWERS", " " + finalAnswers.size());
    if(new_position == questions.size()-1){
        setFragment(new SurveyEmailFrag(), "emailFrag");
    }else{
        bundle.putString("question", questions.get(new_position+1));
        SurveyQuestionFrag newSurveyFrag = new SurveyQuestionFrag();
        newSurveyFrag.setArguments(bundle);
        Log.d("NEWFRAG", " " + newSurveyFrag.answer);
        if(new_position < questions.size()){
            setFragment(newSurveyFrag, "frag_" + new_position);
            new_position++;
            Log.d("POS", ""+new_position);
        }
    }
}

这是设置 fragment 的实用方法:

public void setFragment(Fragment frag, String tag)
{
    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    Fragment fragment = getFragmentManager().findFragmentById(R.id.surveyContainer);
    if(fragment == null)
    {
        ft.add(R.id.surveyContainer, frag, tag);
    } else {
        ft.replace(R.id.surveyContainer, frag, tag);
    }
    ft.addToBackStack(null);
    ft.commit();
}

当我点击 PREV 按钮时,我会这样做:

@Override
public void onPreviousMove(){
    getFragmentManager().popBackStackImmediate();
}

每次我设置一个新的 Fragment 时,我都会将它添加到返回堆栈 并且每次有人单击 PREV 按钮时,我都会弹出返回堆栈。所以我很困惑(Android 还是新手)并且不知道如何解决这个问题:

我想看到的是,当我单击 NEXT 按钮时,它应该转到下一个问题(数学上应该是 currentQuestion+1,当我单击上一个按钮时,它应该转到 currentQuestion-1,无论我在哪里停下来改变方向,这都应该是正确的。

提前致谢。非常感谢您的帮助!

最佳答案

我修好了伙计们!我可能会考虑在未来使用更好的解决方案,但现在,我所要做的就是在 PREV 按钮中反转过程并检查数组索引以避免异常。

这是我需要的 PREV 按钮代码功能:

首先,设置 fragment 时不要将它们添加到返回堆栈中。然后这样做:

@Override
public void onPrevQuestion(){
    //TODO : do some magic here to reverse course
    Bundle bundle = new Bundle();
    Log.d("ANSWERS", " " + finalAnswers.size());


    if(new_position > 0){
        bundle.putString("question", questions.get(new_position-1));
        SurveyQuestionFrag newSurveyFrag = new SurveyQuestionFrag();
        newSurveyFrag.setArguments(bundle);
        setFragment(newSurveyFrag, "frag_" + new_position);
        new_position--;
        Log.d("POS", ""+new_position);
    }else{
        setFragment(new RateExperienceFrag(), "rateEx");
    }


}

感谢那些提出想法的人。

关于java - 如何修复 Android Activity 中的 BackStack 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21313583/

相关文章:

android - 在 SciChart 中实现 TA-lib

android - 导航到新 fragment 时删除底部导航

java - OnActivityResult不是调用内部fragment而是调用android中的Main Activity

android - FragmentTransaction::replace() 有或没有 addToBackStack()

Java校验和方法

java - 模拟异常

java - Findviewbyid 找不到按钮

java - [[我不能被转换为 [I Exception

java - 将对象(String、String、int、int)添加到 ArrayList

java - 如何在 Android Studio 中添加 commons-math 库