我正在编写一个使用FrameLayout
和Fragments
作为其组件的Android应用程序。
我有3个片段:CommunityFragment
,TaskFormFragment
,TaskFragment
。
在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
答案 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();
}
看看是否修复了它