FragmentTransaction add() 行为

FragmentTransaction add() behavior

使用片段 我一直使用 replace() 处理我的事务,但我希望我不必再保存实例状态来恢复片段的视图并防止在返回到该片段时重新加载。所以,我决定与 add() 一起工作。问题是当我添加另一个片段时,前一个片段视图保留在后台并且很好(这是我预期的行为),但问题是我实际上可以与后台的视图进行交互。 示例:

片段 A 有一个 Button

片段 B 有一个 TextView

当我添加 片段 A 并随后添加 片段 B 时,我可以点击 片段 A 的 Button,甚至停留在 片段 B 的 视图上。

我正在使用:

FragmentTransaction fragmentTransaction = 
            getSupportFragmentManager().beginTransaction().
            add(getRootViewContainer(),fragment,fragment.getClass().getSimpleName());

if (shouldGoBack) 
    fragmentTransaction.addToBackStack(fragment.getClass().getSimpleName());

其中 getRootViewContainer() returns FrameLayoutid 我正在用作我的 activity 主容器。

现在,这真的是 add() 的默认行为吗?

如果是这样,是否有适当的方法来避免这种情况,或者只需要使用 replace()

是的,这是 add() 的默认行为。 如果您真的不想使用 replace(),您可以尝试禁用 "old" 片段中的视图。

FragmentTransaction.hide(fragmentBehind); //works for me!

示例:

//I have it globally available
FragmentTransaction trans = MainActivity.getManager().beginTransaction(); 

//not globally 
FragmentTransaction trans = getFragmentManager().beginTransaction();
MapFragment newFragment = new newFragment();
trans.add(R.id.fragmentContainer, newFragment, tag);
trans.hide(this);
trans.addToBackStack(tag);
trans.commit();

你在这里可以做的只是在当前片段的交易时隐藏前一个片段。

 FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
  Fragment newFragment= new MyFragment ();
  ft.hide(CurrentFragment.this);
  ft.show(newFragment);
  ft.commit();

它对我有用,试试吧。