我正在尝试在ListView项目中使用YouTubePlayerSupportFragment. ListView位于Activity中的Fragment中.由于存在嵌套片段,我使用getChildFragmentManager()方法尝试从XML布局中查找片段.这是代码.
Java的
convertView = inflater.inflate(R.layout.youtube_post_layout,null);
YouTubePlayerSupportFragment youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_video);
if (youTubePlayerFragment == null) {
Log.i("YouTube","player is null");
} else {
Log.i("YouTube",youTubePlayerFragment.toString());
}
XML
问题是,当我尝试通过执行findFragmentById()从XML获取它来创建片段时,它返回null,这就是发布到堆栈跟踪的内容.
我正在尝试关注YouTube API示例并对嵌套片段进行更改,但我无法找出导致问题的原因.
首先,直接从XML中扩展子片段是not supported.在嵌套片段时,必须使用父片段中的getChildFragmentManager以语音方式添加它们.
其次,即使它起作用(并且在某些情况下可能),你已经夸大了视图但没有将它添加到实际片段的布局中.这就是膨胀方法中的second and third parameters所在. FragmentManager将在其当前布局中查找片段,或在backstack中查找事件,但无法找到以随机XML膨胀的片段,并且永远不会使用.
最后,也是最重要的一点,你永远不应该在ListView中添加片段作为项目.片段期望生命周期与它们所处的活动相关联,而ListView或任何一般的AdapterView将根据需要创建,销毁和回收其子级.
可能的解决方案:
>您的列表中需要多少个视频?如果它们不多,ScrollView LinearLayout实际上可能是最简单的解决方案.
>如果你真的需要查看回收,也许你可以在每一行都没有实时视频吗?考虑在您的行中使用YouTubeThumbnailView,然后将用户重定向到另一个活动/在位于布局列表外部的单个YoutubeFragment中加载视频.
>如果您肯定希望直接在列表中的每一行播放视频,则需要在行布局上使用YoutubePlayerView而不是片段.在这种情况下,请仔细阅读文档,因为您需要自己处理视频初始化和查看回收.