获取片段动态附加到 <FrameLayout>?

Posted

技术标签:

【中文标题】获取片段动态附加到 <FrameLayout>?【英文标题】:Get Fragment dynamically attached to <FrameLayout>? 【发布时间】:2013-03-07 17:27:45 【问题描述】:

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

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

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

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 保存在某个地方,所以我不需要再次找到它。但我相信应该有办法找回它。

【问题讨论】:

developer.android.com/reference/android/app/… 感谢@Luksprog 的回复。但我无法向 aFrag 添加 ID。 没有,即使你用上面的方法和R.id.FragmentContainer? 哦,是的!答对了!我一直在问愚蠢的问题(嘘......)答案是:((aFrag) getSupportFragmentManager().findFragmentById(R.id.FragmentContainer))。谢谢@Luksprog 【参考方案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。对吗?

以上是关于获取片段动态附加到 <FrameLayout>?的主要内容,如果未能解决你的问题,请参考以下文章

将片段附加到framelayout时如何删除空格

Android在活动视图中附加片段获取片段已添加错误

多次调用片段 onCreateView

尝试将片段添加到我的片段容器 FrameLayout

尝试将片段添加到我的片段容器 FrameLayout

以编程方式将片段添加到android中的框架布局