假设我有片段A,我从中打开一个像这样的DialogFragment
:
FragmentActivity fragmentActivity = (FragmentActivity) view.getContext();
FragmentTransaction ft = fragmentActivity.getSupportFragmentManager().beginTransaction();
Fragment prev = fragmentActivity.getSupportFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
DialogFragment fragmentDialog = MyDialogFragment.newInstance();
fragmentDialog.show(ft, "dialog");
在此对话框中,单击(正/中/负)按钮后,我想打开片段B,它应该替换片段A.
在Dialog的onClick方法中,我运行父Activity的回调方法:
@Override
public void onClick(DialogInterface dialog, int which) {
switch(which) {
case DialogInterface.BUTTON_NEUTRAL:
detailsCallbacks.openMoreDetails();
break;
}
}
最后我的Activity的openMoreDetails()
方法如下所示:
@Override
public void openMoreDetails() {
Fragment fragmentB = Fragment.newInstance();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragmentB);
ft.addToBackStack(null);
ft.commit();
}
我得到的是奇怪的。片段B在屏幕上闪烁仅几秒钟,然后再次被片段A替换(覆盖?)。
当我点击向上按钮时,我甚至从片段A返回,因此这些事务中没有添加到后栈。我想显示片段B,然后按下按钮返回片段A.
它有可能吗?我的做法有什么不对?
刚遇到同样的问题:
片段A显示自定义对话框片段。
单击对话框片段的其中一个按钮,我想删除对话框并显示片段B.
片段B显示并立即消失。我的屏幕再次显示片段A.
我最初的实施出了什么问题:
private void onClickInscription() {
FragmentInscription frag = FragmentInscription.newInstance();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.main, frag);
ft.addToBackStack(null);
ft.commit();
dismiss();
}
而正确的一个:
private void onClickInscription() {
dismiss();
FragmentInscription frag = FragmentInscription.newInstance();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.main, frag);
ft.addToBackStack(null);
ft.commit();
}
因此,尝试先在对话框中调用dismiss,然后应用FragmentTransction
我知道这是问题发布以来的很长一段时间,但我通过在替换声明之前添加if(fragmentB.getView != null)
来解决它。
它最终没有闪光并消失的东西。 (:
您不应该从Fragment打开对话框。实现从FragmentS到您的活动的回调,让活动处理所有片段事务。