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