FragmentTransaction完成时是否可以有一个事件?
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment).commit();
事实上,我为我的应用程序使用抽屉,并且我希望在事务完成后触发invalidateOptionsMenu();
以更改操作栏的菜单。
答案 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