【发布时间】: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()上发生变化?如果是这样,那么通过标签名查找似乎是唯一可能的解决方案。