Android后退按钮从backstack带来错误的片段

时间:2014-01-07 22:56:49

标签: android android-fragments

我正在编写一个使用FrameLayoutFragments作为其组件的Android应用程序。

我有3个片段:CommunityFragmentTaskFormFragmentTaskFragment

在CommunityFragment中,用户按下按钮以创建任务。然后,TaskFromFragment替换为FrameLayout 中的CommunityFragment addToBackStack。因为在那之后,我想用后退按钮返回CommunityFragment。

在TaskFormFragment中,用户按下“创建”按钮以创建任务。然后TaskFragment打开不带 addToBackStack,因为我不想在按下后退按钮时显示TaskFormFragment。

所有这些都很完美。当我按下TaskFragment中的后退按钮时,会显示CommunityFragment。但是,在那之后,如果我打开TaskFormFragment并按回按钮,它不会显示CommunityFragment!相反,它打开TaskFragment。

这怎么可能发生?这是我的片段转换代码:

CommunityFragment TaskFormFragment

TaskFormFragment newFragment = new TaskFormFragment();
Bundle args = new Bundle();
args.putLong("taskTypeId", taskTypeId);
args.putLong("communityId", community.getId());
newFragment.setArguments(args);

FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container, newFragment);
transaction.addToBackStack(null);
transaction.commit();

TaskFormFragment TaskFragment

TaskFragment newFragment = new TaskFragment();
Bundle args = new Bundle();
args.putLong("taskId", task.getId());
newFragment.setArguments(args);

FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container, newFragment);
transaction.commit();

编辑:我在此条目中找到了解决方案:Problems with Android Fragment back stack

2 个答案:

答案 0 :(得分:4)

我在另一篇文章中找到了解决方案。我已将这些方法添加到包含FrameLayout的Activity类中:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
            this.finish();
            return false;
        } else {
            getSupportFragmentManager().popBackStack();
            removeCurrentFragment();
            return false;
        }
    }

    return super.onKeyDown(keyCode, event);
}


public void removeCurrentFragment() {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    Fragment currentFrag =  getSupportFragmentManager().findFragmentById(R.id.detailFragment);

    if (currentFrag != null)
        transaction.remove(currentFrag);

    transaction.commit();
}

此问题的描述和解决方案如下: Problems with Android Fragment back stack

答案 1 :(得分:1)

一旦用户按下Task片段并返回社区片段,您应该清除您的Backstack。您的问题是它没有被清除,因此当您按下时,您将转到上一个交易。

编辑:

因此,在更换社区片段之前,请运行此

for(int i =0;i<fragmentmanager.getBackStackEntryCount();i++){
fragmentmanager.popbackstack();
}

看看是否修复了它