Android getSupportFragmentManager()

Android getSupportFragmentManager(),android,android-fragments,Android,Android Fragments,我有一个带有碎片的基本应用程序。我的activity_main.xml有一个 <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:

我有一个带有碎片的基本应用程序。我的activity_main.xml有一个

<FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginTop="200dp"
        android:background="@android:color/holo_green_light" />
其中
初始化youtubeplyer()是:

youTubePlayerFragment = (YouTubePlayerSupportFragment)getSupportFragmentManager().findFragmentById(R.id.youtube_player_fragment);
....some other code...
RadioFragment是所需片段的java文件,其内容为:

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_radio, container, false);
    }

初始化youtubeplyer()中的行返回一个空指针,然后在代码中我得到NPE

您将静态片段和动态片段混为一谈。您在XML中定义的片段(带有
标记)不是通过
碎片管理器加载的,而是在布局膨胀时自动创建的

将您的
FrameLayout
完全替换为您的
片段
代码,并使用以下内容访问:

final YouTubeSupportFragment frag = (YouTubeSupportFragment) getSupportFragmentManager().findFragmentById(R.id.whatever_id_you_use);
frag.initalize(...);
编辑: 我在YouTube片段上写了另一个答案,其中有关于活动外观的更详细示例代码

编辑2:

如果
RadioFragment
有一个包含YouTube片段的布局,那么你应该保持你的活动代码不变,而是在RadioFragment中初始化你的YouTube片段。您可能需要使用
getChildFragmentManager()
而不是
getFragmentManager()
,因为YouTube片段嵌入了另一个片段(
RadioFragment

当您在片段布局中使用
标记时,它会作为子片段添加。这意味着
YouTubePlayerSupportFragment
不是添加到活动的碎片管理器,而是添加到该片段的
getChildFragmentManager()

这意味着检索
YouTubePlayerSupportFragment
的正确方法是从创建它的片段中检索-您的
RadioFragment
。在您的
RadioFragment
中,您可以使用:

youTubePlayerFragment = (YouTubePlayerSupportFragment)
   getChildFragmentManager().findFragmentById(R.id.youtube_player_fragment);

一般来说,您的活动不应该触及它添加的片段的布局,也不应该触及其中创建的子片段。相反,您希望您的
RadioFragment
管理它直接创建的
YouTubePlayerSupportFragment
,而不涉及活动。

为什么您的活动会进入片段的布局?添加
YouTubePlayerSupportFragment
的片段不应该是与之交互的片段吗?请尝试使用下面的方法one@ianhanniballake因此,您建议我将所有与YTPF相关的代码移动到fragments Java文件?或将
直接移动到您的活动布局中。片段的全部目的是封装用户界面的一部分。但是片段还有其他部分,而不仅仅是YT播放器。你的YouTube片段嵌入到RadioFragment中了吗?在这种情况下,您需要运行我在
RadioFragment
中发布的代码,而不是您的活动,因为YouTube片段是RadioFragment布局的一部分。请记住,您可能需要使用
getChildFragmentManager()
而不是
getFragmentManager()
(请参阅我的更新)谢谢您的建议和解释,我会尝试的!你用什么方法打电话?它必须在
onCreateView
之后(因为这是使布局膨胀的原因),因此通常情况下,您会在
onViewCreated()中执行此操作。
非常感谢!一旦我将代码放入onViewCreated()中,它就工作了!
final YouTubeSupportFragment frag = (YouTubeSupportFragment) getSupportFragmentManager().findFragmentById(R.id.whatever_id_you_use);
frag.initalize(...);
youTubePlayerFragment = (YouTubePlayerSupportFragment)
   getChildFragmentManager().findFragmentById(R.id.youtube_player_fragment);