【问题标题】:Android ChildFragmentManager().findFragmentById() always nullAndroid ChildFragmentManager().findFragmentById() 始终为空
【发布时间】:2016-01-28 11:09:15
【问题描述】:

我偶然发现了一个疯狂的小“错误”,或者我只是做错了什么。我正在尝试获取对片段内的片段的引用。所以我们有ParentFragment,它是MainActivity 的一个孩子。我可以毫无问题地获得对这个 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 中获取所有片段,对其进行迭代等。但这总是返回 null:

getChildFragmentManager().getFragments()

你知道为什么会这样吗?如果片段不是通过代码添加的,我不能使用 ChildFragrentManager 吗?

谢谢!

【问题讨论】:

  • 我认为您应该尝试使用他们的Tag 来查找他们。
  • 测试过了,没啥区别,注意getChildFragmentManager().getFragments()也返回null。
  • 哦。我之前没有真正使用过子片段,但是没有像getSupportChildFragmentManager()这样的方法吗?考虑到这些似乎是支持片段,如果存在,那就是它。
  • 不只是 getChildFragmentManager.. 让我试着让一切都成为常规片段而不是支持片段
  • 支持片段的getChildFragmentManager方法返回支持片段管理器。支持 Fragment 自然不支持原生子 Fragment。

标签: android android-fragments child-fragment


【解决方案1】:

您必须动态添加您的子片段。见here

注意:当该布局时,您不能将布局膨胀为片段 包括一个。仅在添加时才支持嵌套片段 动态到一个片段。

ps。如果您打算使用嵌套片段,请为各种奇怪的行为做好准备,您可以在 android 平台的错误报告中找到它们:

https://code.google.com/p/android/issues/list?can=2&q=nested+fragment&sort=-opened&colspec=ID+Status+Priority+Owner+Summary+Stars+Reporter+Opened&cells=tiles

【讨论】:

  • 这不是必须的,只要你不使用支持类。
  • @ErikTerwan 也有不支持嵌套片段的问题(或者他们最近修复了它们),你可以在这里阅读:code.google.com/p/android/issues/…
  • 是的,关于 ChildFragments 仍然存在的事情我没有注意到,在删除 ParentFragment 并再次添加它之后,一切都很好。片段按照应有的方式重新创建。所以我猜他们解决了这个问题..?
  • 可能,使用本机片段支持的问题在于,如果您在较旧的设备上运行它,那么这些修复将(可能)不会应用,因此您必须始终在所有支持的 API 上测试您的代码版本。借助支持库,它的简单支持库始终在您的 APK 中
【解决方案2】:

如果您想使用嵌套片段并能够通过 findFragmentById 获得对它们的引用,则不能使用支持包。

我将所有getSupportFragmentManager() 更改为getFragmentManager(),并将所有FragmentActivity 替换为常规Activity

现在它可以正常工作了,只需致电getChildFragmentManager().findFragmentById()

【讨论】:

  • 请注意 Marcin Jędrzejewski 的回答,可能会出现一些奇怪的行为。
猜你喜欢
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 2020-08-08
  • 2012-07-30
相关资源
最近更新 更多