Android getSupportFragmentManager()
我有一个带有碎片的基本应用程序。我的activity_main.xml有一个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:
<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);