Android ChildFragmentManager().findFragmentById() 始终为空
Android ChildFragmentManager().findFragmentById() always null
我陷入了一个疯狂的小问题 'bug',或者我只是做错了什么。我正在尝试获取对片段内片段的引用。所以我们有 ParentFragment
,即 MainActivity
的 child。我可以毫无问题地获得对此 ParentFragment 的引用,因为 ParentFragment
通过代码添加到 MainActivity
:
ParentFragment fragment = new ParentFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragmentPlaceholder, fragment);
transaction.commit();
我通过 XML 向 ParentFragment
添加了一个 ChildFragment
,如下所示:
parent_fragment.xml
<RelativeLayout ... etc>
.. some other views, findViewById('') works great on these.
<fragment
android:layout_width="70dp"
android:layout_height="70dp"
android:id="@+id/childFragment1"
android:tag="1"
class="com.my.package.ChildFragment"
android:name="com.my.package.ChildFragment"
tools:layout="@layout/child_fragment" />
</RelativeLayout>
一切正常,ChildFragment(s) 显示在 ParentFragment 中。唯一的事情是;我找不到 fragmentById。
我已经尝试了多种方法来实现这一目标,应该如何实现(?):
getChildFragmentManager().findFragmentById(R.id.childFragment1)
没用。此外,获取 Activity 并使用该片段管理器不起作用(.. 当然)。
我也试过获取 ChildFragmentManager 中的所有片段,遍历它们等等。但这总是 returns null:
getChildFragmentManager().getFragments()
你知道为什么会这样吗?如果片段不是通过代码添加的,我不能使用 ChildFragrentManager 吗?
谢谢!
您必须动态添加您的子片段。见 here:
Note: You cannot inflate a layout into a fragment when that layout
includes a <fragment>. Nested fragments are only supported when added
to a fragment dynamically.
ps。如果您打算使用嵌套片段,请为各种奇怪的行为做好准备,您可以在 android 平台的错误报告中找到它们:
如果您想使用嵌套片段并能够通过 findFragmentById 获取对它们的引用,则不能使用支持包。
我将所有 getSupportFragmentManager()
更改为 getFragmentManager()
,并将所有 FragmentActivity
替换为常规 Activity
。
现在它按预期工作了,只需调用 getChildFragmentManager().findFragmentById()
。
我陷入了一个疯狂的小问题 'bug',或者我只是做错了什么。我正在尝试获取对片段内片段的引用。所以我们有 ParentFragment
,即 MainActivity
的 child。我可以毫无问题地获得对此 ParentFragment 的引用,因为 ParentFragment
通过代码添加到 MainActivity
:
ParentFragment fragment = new ParentFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragmentPlaceholder, fragment);
transaction.commit();
我通过 XML 向 ParentFragment
添加了一个 ChildFragment
,如下所示:
parent_fragment.xml
<RelativeLayout ... etc>
.. some other views, findViewById('') works great on these.
<fragment
android:layout_width="70dp"
android:layout_height="70dp"
android:id="@+id/childFragment1"
android:tag="1"
class="com.my.package.ChildFragment"
android:name="com.my.package.ChildFragment"
tools:layout="@layout/child_fragment" />
</RelativeLayout>
一切正常,ChildFragment(s) 显示在 ParentFragment 中。唯一的事情是;我找不到 fragmentById。
我已经尝试了多种方法来实现这一目标,应该如何实现(?):
getChildFragmentManager().findFragmentById(R.id.childFragment1)
没用。此外,获取 Activity 并使用该片段管理器不起作用(.. 当然)。
我也试过获取 ChildFragmentManager 中的所有片段,遍历它们等等。但这总是 returns null:
getChildFragmentManager().getFragments()
你知道为什么会这样吗?如果片段不是通过代码添加的,我不能使用 ChildFragrentManager 吗?
谢谢!
您必须动态添加您的子片段。见 here:
Note: You cannot inflate a layout into a fragment when that layout includes a <fragment>. Nested fragments are only supported when added to a fragment dynamically.
ps。如果您打算使用嵌套片段,请为各种奇怪的行为做好准备,您可以在 android 平台的错误报告中找到它们:
如果您想使用嵌套片段并能够通过 findFragmentById 获取对它们的引用,则不能使用支持包。
我将所有 getSupportFragmentManager()
更改为 getFragmentManager()
,并将所有 FragmentActivity
替换为常规 Activity
。
现在它按预期工作了,只需调用 getChildFragmentManager().findFragmentById()
。