从DialogFragment打开片段(替换Dialogs父级)

时间:2013-02-01 16:05:45

标签: android android-fragments android-dialogfragment

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

有可能吗?我的做法有什么不对?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

它最终没有闪烁并消失的东西。 (:

答案 2 :(得分:0)

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