0

我正在使用一个 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。

4

0 回答 0