我想在按下按钮后看到DialogFragment,我有两个代码片段:
首先:
if (view.equals(b1)) {
Fragment2 fr2 = new Fragment2();
fr2.show(manager, "addCity");
}我不明白为什么这个标记会出现在show ()方法中,因为它对程序更改没有任何影响。
第二:
Fragment fr = manager.findFragmentByTag("addCity");
if (view.equals(b1)) {
if (fr != null) {
manager.beginTransaction().remove(fr).commit();
}
Fragment2 fr2 = new Fragment2();
fr2.show(manager, "addCity");
}在第二个例子中,我不明白这行代码是做什么用的:
Fragment fr = manager.findFragmentByTag("addCity");因为参考变量fr将总是空的,因为在这种标签的名称下当前没有片段。
另外,为什么会出现这种情况,因为之前的更改fr总是为空,所以这个if永远不会实现。
if (fr != null) {
manager.beginTransaction().remove(fr).commit();
}发布于 2019-09-03 08:52:43
当您使用show(manager, "addCity")时,第二个参数是片段的标记。通过使用带有相同标记的findFragmentByTag(),可以查看DialogFragment是否已经存在,如果存在(fr != null),则删除它。
这是防御性很强的代码,可能是为了避免用户非常非常快地双击按钮。但是,因为它没有使用showNow() (而不是show()),所以它在这方面做得并不好,因为show()是异步的。
通常,您根本不需要这些代码-只需使用您想要的任何标记调用show(),而无需任何仪式(只有当您稍后尝试使用findFragmentByTag()在事后检索DialogFragment时,此标记才有意义)。
但是,如果您确实希望保持防御性,并避免用户打开两个对话框这一极其罕见的机会,那么您需要
1)使用showNow()而不是show(),这样FragmentManager就会立即更新,确保findFragmentByTag()在这种情况下确实会返回片段2)不要删除然后再次调用show(),只要不调用已经显示的show() -您只是在做额外的工作。
这意味着您的代码将如下所示
if (view.equals(b1)) {
Fragment existingDialog = manager.findFragmentByTag("addCity");
// Only add a new dialog if it isn't already present.
if (existingDialog == null) {
Fragment2 fr2 = new Fragment2();
fr2.showAll(manager, "addCity");
}
}https://stackoverflow.com/questions/57762714
复制相似问题