我正在使用一个 Activity,它一次包含一个 Fragment。我使用 support.v4。Activity 和 Fragment 的“onBackPressed”被覆盖了,所以我不能使用原来的后退按钮,我必须自己覆盖它。
所以我在片段 A 中,我转到片段 B。片段 B 显示结果列表,当我选择一行时,它转到片段 C。当我在 C 上并按下返回按钮时,我想返回 B 并显示结果。如果我再次按下返回按钮,我会去 A。看起来很简单。
我管理从 C 到 B 的返回。问题是当我按下 B 上的后退按钮时,它调用 Fragment C backPressed。
A -> B -> C -> B(显示 B 但 BackButton 不再起作用)。
一些代码:在 Fragment C 中的 backPressed
public void backPressed() {
FragmentTransaction transaction = ((FragmentActivity)m_context).getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.mainactivity_fragmentcontainer,((FragmentActivity)m_context).getSupportFragmentManager().findFragmentByTag("customtag"), "customtag");
transaction.commitAllowingStateLoss();
}
片段 B 具有标签“customtag”。
当我用 C 替换 B 时:
FragmentC newFrag = new FragmentC(m_context);FragmentTransaction transac = ((FragmentActivity)m_context).getSupportFragmentManager().beginTransaction();
((FragmentContainerActivity)m_context).setCurrentFragment(newFrag);
transac.replace(R.id.mainactivity_fragmentcontainer, newFrag);
transac.addToBackStack(null);
transac.commitAllowingStateLoss();
知道为什么被替换的片段C(显示发生变化,我可以看到片段B)仍然获得后退按钮动作吗?
谢谢你的帮助。
编辑 片段 B 中的 backPressed 代码(但是,当它来自片段 C 时,应用程序永远不会去那里)。
@Override
public void backPressed() {
Log.e("FragmentB", "backPressed");
//I have 2 views in FragB. If View2 is visible, I make it gone and display View1
if(mainView.findViewById(R.id.view2).getVisibility()==View.VISIBLE){
displayView1();
}else{
if(fromFragmentX){
FragmentX fragX = new FragmentX(ctx);
FragmentTransaction transac = ((FragmentActivity)ctx).getSupportFragmentManager().beginTransaction();
((FragmentContainerActivity)ctx).setCurrentFragment(fragX);
transac.replace(R.id.mainactivity_fragmentcontainer, fragX);
transac.commitAllowingStateLoss();
}else{
super.backPressed();
}
}
}
第二次编辑
我意识到我忘了精确的东西。当我用片段 C 替换片段 B 时,我在片段 B 的 ListView 的 ArrayAdapter 中执行此操作,但它不应该改变任何东西。
无论如何,我在应用程序的其他地方尝试了一些不同的东西。在 FragmentU 中,我将 FragmentU 替换为 Fragment C(始终相同),并且我在 Fragment C 中设置了一个属性:
private CustomFragment fragmentFrom;
所以在 FragmentC 中的 backPressed,如果我来自 Fragment U,我会调用:
FragmentTransaction transaction = ((FragmentActivity)ctx).getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.mainactivity_fragmentcontainer, fragmentFrom);
transaction.commitAllowingStateLoss();
我仍然遇到同样的问题。当从 Fragment C 回来时,会显示 Fragment U,并且运行良好,但是返回按钮调用 FragmentC.backPressed。