【问题标题】:Find a reference to AppCompatDialogFragment查找对 AppCompatDialogFragment 的引用
【发布时间】:2020-02-17 23:47:56
【问题描述】:

在我的 Andriod 应用程序中,我有一个从 AppCompatDialogFragment 扩展的对话框。我立即在我的应用程序的主 Activity 的 onCreate 中显示它:

@Override
protected void onCreate(Bundle savedState)
  {
  super.onCreate(savedState);

  // ....

  if( savedState==null )
    {
    MyDialog diag = new MyDialog();
    diag.show(getSupportFragmentManager(), null);
    }
  }

稍后我想关闭此对话框 - 所以我需要找到它。我不能简单地记住在我的活动中对它的引用,例如当我旋转手机,重新创建对话框,我的参考将无效。

以后如何在我的代码中获取对 MyDialog 的引用?

【问题讨论】:

  • savedState 不会是 null ...那为什么要重新创建它??
  • @MartinZeitler - 片段会自动保存和恢复。 savedState==null 是必要的,以确保它只被创建一次。
  • @ianhanniballake onConfigurationChange() 它仍然不会进入那个分支,因为那时它不会是null。通过标签名查找它看起来很可靠,因为它不会增加任何混乱,即使它只是一个局部变量。如果它是关于 1 个对话框或多个对话框,如果保持对实例的引用或使用片段标签更适合,这可能确实是一个区别。
  • @MartinZeitler - 如果您手动处理配置更改,您根本不会经过onCreate()。您将总是需要从 FragmentManager 查找对片段的引用,因为它们将总是与活动一起重新创建 - 这正是 tag 的用途。真正唯一的因素是您是在 else 块中查找 savedState != null 时还是按需查找。无论哪种情况,找到片段的代码都是相同的。
  • @ianhanniballake 这是否意味着对对话框实例的引用可能会在onConfigurationChange() 上发生变化?如果是这样,那么通过标签名查找似乎是唯一可能的解决方案。

标签: android dialogfragment


【解决方案1】:

show() 的第二个参数是tag

这个标签允许您稍后使用findFragmentByTag() 来检索该片段。

因此,只需使用null以外的任何其他值

diag.show(getSupportFragmentManager(), "dialog");

然后你就可以检索片段了:

MyDialog diag = (MyDialog) getSupportFragmentManager().findFragmentByTag("dialog");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    相关资源
    最近更新 更多