43

当 FragmentTransaction 完成时是否有可能发生事件?

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

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

4

7 回答 7

57

不需要等待分片交易完成,可以调用

getSupportFragmentManager().executePendingTransactions();

在您的 commit() 函数调用之后。

这将确保交易完成。

于 2013-11-01T10:03:38.163 回答
13

嘿!尝试这个:

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();
于 2014-07-11T09:59:28.860 回答
10

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

....
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();

请检查 runOnCommit() 方法限制!

于 2019-08-26T11:17:52.547 回答
6
@Override
public void onResume() {
    super.onResume();
    getActivity().invalidateOptionsMenu();
}

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

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

于 2016-01-10T12:10:34.793 回答
3

您可以使用此答案中给出的建议--- 在事务从该onAnimationEnd方法完成后运行您需要的代码。

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

transaction.setCustomAnimations(R.anim.slide_in_left,
                                R.anim.slide_out_right);
于 2014-01-22T15:04:50.667 回答
1

您可以考虑使用 commitNow() 而不是 commit(),然后您可以确定事务已经完成。当然,如果您应该这样做,这取决于交易的复杂性。

于 2016-08-09T12:51:27.243 回答
-3

这个方法怎么样:

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

当 commit() 完成时,您可以获得FRAGMENT_COMMIT_FINISHED

于 2018-12-25T04:00:52.853 回答