Подтвердить что ты не робот

Событие, когда завершено FragmentTransaction

Возможно ли иметь событие, когда завершено FragmentTransaction?

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

Фактически, я использую ящик для своего приложения, и я хотел бы вызвать invalidateOptionsMenu();, когда транзакция завершится, чтобы изменить меню моей панели действий.

4b9b3361

Ответ 1

Вам не нужно ждать завершения транзакции фрагмента, вы можете позвонить

getSupportFragmentManager().executePendingTransactions();

после вызова функции commit().

Это обеспечит завершение транзакции.

Ответ 2

Hei! Попробуйте следующее:

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

И в Transaction добавьте тег backback так:

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

Ответ 3

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

Когда FragmentTransaction будет завершено, будут вызываться методы жизненного цикла фрагмента, такие как onResume()

FYI, фрагмент может иметь свое собственное меню, см. http://developer.android.com/reference/android/app/Fragment.html#setHasOptionsMenu(boolean)

Ответ 4

Вы можете использовать рекомендации, приведенные в этом ответе, - введите код, который вам нужен после завершения транзакции с помощью метода onAnimationEnd.

Для этого вам нужно настроить анимацию на FragmentTransaction, например,

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

Ответ 5

Вы можете использовать commitNow() вместо commit(), и тогда вы можете быть уверены, что транзакция завершена. Конечно, это вопрос сложности транзакции, если вы должны это делать или нет.

Ответ 6

Слишком поздно, но это может помочь (выкладывать сюда для кого-то может):

....
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 on resume. you can check.
    }
});
fragmentTransaction.commit();

Пожалуйста, проверьте ограничения метода runOnCommit()!

Ответ 7

Это будет работать, я сам проверил.

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)

Ответ 8

как насчет этого метода:

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

после завершения commit() вы можете получить событие FRAGMENT_COMMIT_FINISHED