FragmentTransaction完成时的事件

lop*_*ael 36 android listener fragment

FragmentTransaction完成后是否可以有一个事件?

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment).commit();
Run Code Online (Sandbox Code Playgroud)

事实上,我为我的应用程序使用抽屉,并且我想invalidateOptionsMenu();在事务完成时触发以更改操作栏的菜单.

Eld*_*abu 51

您无需等待片段事务完成,您可以调用

getSupportFragmentManager().executePendingTransactions();
Run Code Online (Sandbox Code Playgroud)

在commit()函数调用之后.

这将确保交易完成.

  • 这是不准确的,而在返回**commit**和**executePendingTransactions**之后添加片段时,片段堆栈具有添加的片段,同时删除或替换片段并且在**commit**和**executePendingTransactions*之后*被调用,被删除的片段仍然在堆栈中,直到稍后.因为UX的原因,以后删除和销毁片段是有道理的,但这不是获得事务完成事件的正确方法! (9认同)
  • 我的问题不是我的交易是否顺利,而是知道什么时候结束.否则,我的视图显示与更改操作的菜单栏之间存在差距. (5认同)
  • 我认为这是一个有效的答案,即使它不是"事件"本身.executePendingTransactions()将*阻止*直到事务完成,并且在事务完成后将调用它之后的下一个命令,就像事件一样,甚至没有事件监听器的开销. (2认同)

Mik*_*eps 11

喜!试试这个:

private OnBackStackChangedListener backStackListener =  new OnBackStackChangedListener() {

    @Override
    public void onBackStackChanged() {
        String name = "";
        int position = getSupportFragmentManager().getBackStackEntryCount();
        if(position!=0){
           FragmentManager.BackStackEntry backEntry=getSupportFragmentManager().getBackStackEntryAt(position-1);
           name=backEntry.getName();


        }
        if(position==0){
            mainActionBar();
        }
        else if(name=="someWord"){
            mainActionBar2();
        }
        else{
            mainActionBar3();
        }

    }
};
 getSupportFragmentManager().addOnBackStackChangedListener(backStackListener);
Run Code Online (Sandbox Code Playgroud)

并在事务中向backStack添加标记,如下所示:

getSupportFragmentManager().beginTransaction()
                .replace(R.id.main, SomeFragment.newInstance(some argument))
                .addToBackStack("someWord").commit();
Run Code Online (Sandbox Code Playgroud)

  • 转换开始时调用`onBackStackChanged`.这永远不会有效. (3认同)

Eng*_*URK 7

为时已晚,但这可能会有所帮助(放在这里供某人使用):

....
fragmentTransaction.replace(R.id.contentFrame, fragment);
fragmentTransaction.runOnCommit(new Runnable() // be carefull on this call. check documentation!!
{
    @Override
    public void run()
    {
        ... do something...  // this will  run after fragment's on resume. you can check.
    }
});
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

请检查 runOnCommit() 方法限制!

  • 如果您使用支持 FragmentTransaction 库(大多数应该是),则不需要 API 26。`androidx.fragment.app.FragmentTransaction` (2认同)

JIE*_*ANG 6

@Override
public void onResume() {
    super.onResume();
    getActivity().invalidateOptionsMenu();
}
Run Code Online (Sandbox Code Playgroud)

FragmentTransaction完成后,将调用Fragment的生命周期方法,如onResume()

仅供参考,片段可以有自己的菜单,请参阅http://developer.android.com/reference/android/app/Fragment.html#setHasOptionsMenu(boolean)