如何通过其标签找到DialogFragment?

时间:2020-02-07 04:58:10

标签: java android

我一直在寻找解决方案,但找不到。 我有一个名为ImportDialog的DialogFragment,带有相同名称的标签。如何从MainActivity获取此ImportDialog实例?

4 个答案:

答案 0 :(得分:1)

尝试一下

FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment frg= getFragmentManager().findFragmentByTag("dialog");
 if (frg!= null) {
        ft.remove(frg);
    }
    ft.addToBackStack(null);

DialogFragment newFragment = MyDialogFragment();
newFragment.show(ft, "dialog");

答案 1 :(得分:0)

这是您选择代码的方式吗?:

(ImportDialog) getFragmentManager().findFragmentById([ID of layout here]);

我认为,如果您实例化Fragment或至少使其膨胀,将会有所帮助。只有这样,findFragmentById()才能起作用。

但是再说一遍,我确实读到了一些解决方法,例如,如果您没有研究过,可以使用findFragmentByTag选项:

YourFramgent yourFragment = new YourFragment();
fragmentTransaction.add(R.id.fragment_container, myFragment, "yourFragment");
fragmentTransaction.commit();

然后调用它:

YourFragment yourFragment = (YourFragment) getFragmentManager().findFragmentByTag("yourFragment");

答案 2 :(得分:0)

我通过在MainActivity中添加一个接口并在DialogFragment上实现它来解决此问题,这样我就可以将数据从MainActivity传递到Dialog。

答案 3 :(得分:0)

根据官方 Android 文档,“commit”是一个异步操作。

<块引用>

调用 commit() 不会立即执行事务。相反,事务被安排在主 UI 线程上运行,只要它能够这样做。但是,如有必要,您可以调用 commitNow() 立即在您的 UI 线程上运行片段事务。

因此,如果您想在将片段添加或替换到容器后立即获取它的实例,那么您应该使用“commitNow”而不是“commit”。示例如下所示。

RetryDialogFragment().showNow(childFragmentManager, RetryDialogFragment.TAG)
val retryDialogFragment =
        childFragmentManager.findFragmentByTag(RetryDialogFragment.TAG) as RetryDialogFragment

但是,在使用 commitNow 时,您还必须注意以下事实。

<块引用>

请注意,commitNow 与 addToBackStack 不兼容。或者,您可以通过调用 executePendingTransactions() 来执行由尚未运行的 commit() 调用提交的所有挂起 FragmentTransactions。这种方法与 addToBackStack 兼容。

如需更多参考,请查看:Commit is asynchronous