繁体   English   中英

如何通过标签找到 DialogFragment?

[英]How can I find a DialogFragment by its Tag?

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

尝试这个

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");

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

(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");

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

根据官方 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 兼容。

有关相同的更多参考,请查看: 提交是异步的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM