2013-11-01 59 views
28

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

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

其实,我用一个抽屉为我的应用程序,我想触发invalidateOptionsMenu();当交易完成后改变我的操作栏的菜单。

回答

31

您不需要等待片段交易完成,你可以叫

getSupportFragmentManager().executePendingTransactions(); 
你的提交()函数调用之后

这将确保交易完成。

+4

我的问题不在于我的交易是否顺利,而是要知道何时完成。否则,我的视图显示和更改我的操作的菜单栏之间存在差距。 –

+0

当你调用executePendingTransactions..how时,这个事务将会被强制完成,如果加载视图需要一些时间。为了找出这个问题,使用一个静态函数并从片段的onResume中调用它。 –

+2

我认为这是一个有效的答案,即使它本身不是“事件”。 executePendingTransactions()会在事务完成之前阻塞*,并且在事务完成时调用其后的下一个命令,就像事件一样,甚至没有事件监听器的开销。 – auval

3

您可以使用this answer中给出的建议---在onAnimationEnd方法完成交易后运行您所需的代码。

为此,您需要在FragmentTransaction上使用例如

transaction.setCustomAnimations(R.anim.slide_in_left, 
           R.anim.slide_out_right); 
8

嘿!试试这个:

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

而且在交易中添加标签堆栈中是这样的:

getSupportFragmentManager().beginTransaction() 
       .replace(R.id.main, SomeFragment.newInstance(some argument)) 
       .addToBackStack("someWord").commit(); 
+0

只有在您未添加任何自定义动画时才有效。 –

+3

'onBackStackChanged' get在转换开始时被调用。这是永远不会有效的。 – Servus7

0

你可以考虑使用commitNow()而不是commit(),然后你可以确定事务已经完成。 当然,如果你应该做或者不做,它就是交易的复杂性问题。