Ответ 1
Вам не нужно ждать завершения транзакции фрагмента, вы можете позвонить
getSupportFragmentManager().executePendingTransactions();
после вызова функции commit().
Это обеспечит завершение транзакции.
Возможно ли иметь событие, когда завершено FragmentTransaction?
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment).commit();
Фактически, я использую ящик для своего приложения, и я хотел бы вызвать invalidateOptionsMenu();
, когда транзакция завершится, чтобы изменить меню моей панели действий.
Вам не нужно ждать завершения транзакции фрагмента, вы можете позвонить
getSupportFragmentManager().executePendingTransactions();
после вызова функции commit().
Это обеспечит завершение транзакции.
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();
@Override
public void onResume() {
super.onResume();
getActivity().invalidateOptionsMenu();
}
Когда FragmentTransaction будет завершено, будут вызываться методы жизненного цикла фрагмента, такие как onResume()
FYI, фрагмент может иметь свое собственное меню, см. http://developer.android.com/reference/android/app/Fragment.html#setHasOptionsMenu(boolean)
Вы можете использовать рекомендации, приведенные в этом ответе, - введите код, который вам нужен после завершения транзакции с помощью метода onAnimationEnd
.
Для этого вам нужно настроить анимацию на FragmentTransaction, например,
transaction.setCustomAnimations(R.anim.slide_in_left,
R.anim.slide_out_right);
Вы можете использовать commitNow() вместо commit(), и тогда вы можете быть уверены, что транзакция завершена. Конечно, это вопрос сложности транзакции, если вы должны это делать или нет.
Слишком поздно, но это может помочь (выкладывать сюда для кого-то может):
....
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()!
Это будет работать, я сам проверил.
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)
как насчет этого метода:
FragmentManager fm = ...;
fm.beginTransaction().add(xxx, FRAGMENT_TAG).commit();
handler.obtainMessage(FRAGMENT_COMMIT_FINISHED).sendToTarget();
после завершения commit() вы можете получить событие FRAGMENT_COMMIT_FINISHED