【问题标题】:Get Fragment dynamically attached to <FrameLayout>?获取片段动态附加到 <FrameLayout>?
【发布时间】:2026-02-25 02:05:02
【问题描述】:

嗯,我有一个简单的&lt;FrameLayout&gt;

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/FragmentContainer"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

然后在我的代码中,我添加了一个片段:

FragClass aFrag = new FragClass();
getSupportFragmentManager().beginTransaction()
        .replace(R.id.FragmentContainer, aFrag).commit();

在我的代码中的其他地方,我想从 ID R.id.FragmentContainer 中获取 FragClass (extends Fragment) 对象。

我试过了

((ViewGroup) findViewById(R.id.FragmentContainer)).getChildAt(0)

((FrameLayout) findViewById(R.id.FragmentContainer)).getChildAt(0)

但他们返回的是View,而不是附加的Fragment

我知道我可以将变量 aFrag 保存在某个地方,所以我不需要再次找到它。但我相信应该有办法找回它。

【问题讨论】:

  • 感谢@Luksprog 的回复。但我无法向 aFrag 添加 ID。
  • 没有,即使你用上面的方法和R.id.FragmentContainer?
  • 哦,是的!答对了!我一直在问愚蠢的问题(嘘......)答案是:((aFrag) getSupportFragmentManager().findFragmentById(R.id.FragmentContainer))。谢谢@Luksprog

标签: android android-layout android-fragments android-framelayout


【解决方案1】:

让我用一个完整的答案来结束它:)

在这种情况下,动态添加的Fragment使用容器的IDViewViewGroup)。

参考:http://developer.android.com/guide/components/fragments.html#Adding

注意:每个片段都需要一个唯一标识符,如果活动重新启动,系统可以使用该标识符来恢复片段(您可以使用它来捕获片段以执行事务,例如删除它)。可以通过三种方式为片段提供 ID:

  • 为 android:id 属性提供唯一 ID。
  • 为 android:tag 属性提供一个唯一的字符串。
  • 如果前两个都不提供,系统将使用容器视图的 ID。

因为它毕竟是Fragment。我们必须使用getSupportFragmentManager().findFragmentById() 来检索它,它返回一个Fragment,而不是返回一个ViewfindViewById()

所以这个问题的答案是:

((aFrag) getSupportFragmentManager().findFragmentById(R.id.FragmentContainer))

感谢@Luksprog。

【讨论】:

  • 容器活动启动时可能返回null?
  • @HassanMakarov - 感谢您的评论。抱歉,我已经有几年没有编写 Android 代码了。因此,请对我的回复持保留态度。由于我已将 aFrag 附加到 FragmentContainer,为什么它会返回 null?你能解释一下吗?
  • Fragment 不是 View 的子类,因此容器视图可以与 Fragment 具有相同的 id。对吗?