6

假设我有片段 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。

有可能吗?我的方法有什么问题?

4

3 回答 3

3

刚刚遇到同样的问题:

片段 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

于 2013-06-22T14:16:01.677 回答
1

我知道自从问题发布以来已经有很长时间了,但是我通过if(fragmentB.getView != null)在替换语句之前添加一个来解决它。

它终于不做闪光和消失的事情了。(:

于 2019-03-13T11:23:20.603 回答
0

您不应该从 FragmentA 打开对话框。实现从 FragmentA 到活动的回调,并让活动处理所有片段事务。

于 2013-02-01T16:28:47.750 回答