【问题标题】:Opening Fragment from a DialogFragment (replacing the Dialogs parent)从 DialogFragment 打开 Fragment(替换 Dialogs 父级)
【发布时间】:2022-05-04 20:52:35
【问题描述】:

假设我有片段 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");

在此对话框中,单击(正/中/负)按钮后,我想打开 Fragment B,它应该替换 Fragment 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。

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

【问题讨论】:

    标签: android android-fragments android-dialogfragment


    【解决方案1】:

    刚刚遇到同样的问题:

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

    【讨论】:

      【解决方案2】:

      我知道问题发布已经很久了,但我通过在替换语句之前添加if(fragmentB.getView != null) 解决了这个问题。

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

      【讨论】:

        【解决方案3】:

        您不应该从 FragmentA 打开对话框。实现从 FragmentA 到 Activity 的回调,让 Activity 处理所有 Fragment 事务。

        【讨论】:

        • 它仍然只是在 Fragment A 出现后立即闪烁。单击后退/向上时,我得到与从片段 A 中单击后退/向上时相同的操作,因此片段 B 既没有显示(超过半秒)也没有添加到返回堆栈。
        • 我已经毫无问题地重建了这个概念......尝试使用FragmentActivity fragmentActivity = getActivity();而不是你正在做的事情:FragmentActivity fragmentActivity = (FragmentActivity) view.getContext();
        • 但我必须补充一点,我使用的方法与您不同。每当我调用另一个片段时。我将代码放入 Fragment Activity 并让它处理事务。我认为这是更简洁的编码,因为片段不应该相互调用或删除。这是 Activites 的工作。
        • 是的,你的方法绝对比我的更干净。我会在我的应用程序中进行更改。然而,这并没有解决问题。奇怪的是,Fragment B 实际上只出现了几分之一秒,然后又被 Fragment A 取代。
        • 如果删除此行会发生什么Fragment prev = fragmentActivity.getSupportFragmentManager().findFragmentByTag("dialog"); if (prev != null) { ft.remove(prev); }
        猜你喜欢
        • 1970-01-01
        • 2013-10-15
        • 1970-01-01
        • 2022-11-24
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多