FragmentTransaction完成时的事件

时间:2013-11-01 09:58:36

标签: android listener fragment

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

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

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

8 个答案:

答案 0 :(得分:45)

您不需要等待片段交易完成,您可以致电

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

这将确保交易完成。

答案 1 :(得分: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);

在事务中将标签添加到backStack,如下所示:

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

答案 2 :(得分:7)

@Override
public void onResume() {
    super.onResume();
    getActivity().invalidateOptionsMenu();
}

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

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

答案 3 :(得分:3)

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

为此,您需要使用例如

在FragmentTransaction上设置动画
transaction.setCustomAnimations(R.anim.slide_in_left,
                                R.anim.slide_out_right);

答案 4 :(得分:1)

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

答案 5 :(得分:1)

为时已晚,但这可能会有所帮助(将其放在此处供他人使用):

ddMMyyyy

请检查runOnCommit()方法的限制!

答案 6 :(得分:0)

这可以工作,我已经对其进行了自我测试。

val timer = Timer()          
timer.schedule(object : TimerTask(){
                                override fun run() {
                                    activity.runOnUiThread{
                                        if(!fm.executePendingTransactions()){
                                            Log.v("SteveMoretz","HERE");
                                            rootView.visibility = View.GONE
                                            timer.cancel()
                                        }else{
                                            Log.v("SteveMoretz","HERE2");
                                        }
                                    }
                                }
                        },0,200)

答案 7 :(得分:-1)

这种方法怎么样:

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

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

事件