Android 碎片事务完成时发生的事件

Android 碎片事务完成时发生的事件,android,listener,fragment,Android,Listener,Fragment,碎片事务完成时是否可能发生事件 FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.content_frame, fragment).commit(); 事实上,我的应用程序使用抽屉,我想触发invalidateOptions菜单()当事务完成时,更改我的操作栏的菜单。您不需要等待片段事务完成,您可以调用 getSupportFragmentManager().exec

碎片事务完成时是否可能发生事件

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment).commit();

事实上,我的应用程序使用抽屉,我想触发
invalidateOptions菜单()当事务完成时,更改我的操作栏的菜单。

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

getSupportFragmentManager().executePendingTransactions();
在commit()函数调用之后


这将确保事务完成。

您可以使用中给出的建议---在事务完成后,通过
onAnimationEnd
方法运行所需的代码

为此,您需要在FragmentTransaction上设置动画,例如

transaction.setCustomAnimations(R.anim.slide_in_left,
                                R.anim.slide_out_right);
嗨!试试这个:

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);
在事务中,向backStack添加标记,如下所示:

getSupportFragmentManager().beginTransaction()
                .replace(R.id.main, SomeFragment.newInstance(some argument))
                .addToBackStack("someWord").commit();
当FragmentTransaction完成时,将调用片段的生命周期方法,如onResume()

仅供参考,碎片罐有自己的菜单,
请参阅

< p>您可以考虑使用委托()而不是提交(),然后您可以确定事务已经完成。 当然,这是一个事务复杂性的问题,如果你应该做或不做它。

这个方法怎么样:

FragmentManager fm = ...;
fm.beginTransaction().add(xxx, FRAGMENT_TAG).commit();
handler.obtainMessage(FRAGMENT_COMMIT_FINISHED).sendToTarget();

当commit()完成时,您可以获取
FRAGMENT\u commit\u finished

的事件,但这可能会有所帮助(放在这里供某人使用):


请检查runOnCommit()方法限制

我的问题不是我的交易是否顺利,而是要知道交易何时完成。否则,“我的视图”的显示与“我的操作”菜单栏的更改之间会出现间隙。当您调用executePendingTransactions时,事务将强制完成。不过,加载视图需要一些时间。为了找到答案,使用一个静态函数并从片段的onResume调用它。我认为这是一个有效的答案,即使它本身不是“事件”。executePendingTransactions()将一直阻止,直到事务完成,并且在事务完成时将调用它之后的下一个命令,就像事件一样,即使没有事件侦听器的开销。这是不准确的,在返回commit和executePendingTransactions后添加片段时,片段堆栈具有添加的片段;在移除或替换片段时,在调用commit和executePendingTransactions后,移除的片段仍在堆栈中,直到稍后。出于用户体验的原因,稍后删除并销毁片段是有意义的,但是这不是获得事务完成事件的正确方法!我不喜欢这个答案,但我意识到我可以通过在调用
executePendingTransactions()
之后放置一个使用EventBus的事件来解决它,并让我的片段侦听该事件,如果它满足删除条件,那么它可以通过调用
popFragment()来弹出自己
在其片段管理器上。(如果模型数据不存在,我试图将
popFragment()
code放入onResume(),但它给出了
IllegalStateException:FragmentManager已经在执行事务了
error。)我基本上创建了自己的“事件”当它是一个已完成的事务时。仅当您未添加任何自定义动画时,此选项才有效。
onbackbackchanged
get在转换开始时被调用。这永远都是无效的。谢谢@Mikelis,我正在寻找需要时显示后退按钮,AddBackbackChangedListener作为charm:)我认为这一点都没有帮助,伙计,当你进入下一行时,它还没有提交需要API 26,它并不总是可用的。如果您使用的是SupportFragmentTransaction库,则不需要API 26(大多数情况下都应该使用)<代码>androidx.fragment.app.FragmentTransaction
谢谢。这对我帮助很大。
FragmentManager fm = ...;
fm.beginTransaction().add(xxx, FRAGMENT_TAG).commit();
handler.obtainMessage(FRAGMENT_COMMIT_FINISHED).sendToTarget();
....
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();