ListView项目中的YouTubePlayerSupportFragment为null

我正在尝试在ListView项目中使用YouTubePlayerSupportFragmentListView位于ActivityFragment中。 由于存在嵌套片段,我使用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中扩展子片段。 嵌套片段时,必须使用父片段中的getChildFragmentManager以语音方式添加片段。

其次,即使它起作用(在某些情况下也可能),你已经夸大了视图但没有将它添加到实际片段的布局中。 这就是inflate方法中的第二个和第三个参数 。 FragmentManager将在其当前布局中查找片段,或在backstack中查找事件,但无法find以随机XMLforms膨胀的片段,并且永远不会使用。

最后,也是最重要的,您不应该将片段作为项目添加到ListView 。 碎片期望生命周期与它们所处的活动相关联,而ListView或任何一般的AdapterView将根据需要创建,销毁和回收其子级。

可能的解决方案:

  • 您的列表中需要多少个video? 如果它们不多,ScrollView + LinearLayout实际上可能是最简单的解决方案。

  • 如果你真的需要查看回收,也许你可以在每一行都没有实时video吗? 考虑在您的行中使用YouTubeThumbnailView ,然后将用户重定向到另一个活动/在位于布局列表外部的单个YoutubeFragment加载video。

  • 如果您肯定希望直接在列表中的每一行播放video,则需要在行布局上使用YoutubePlayerView而不是片段。 在这种情况下,请仔细阅读文档,因为您需要自己处理video初始化和查看回收。

您的应用程序将崩溃当您尝试使用相同的Fragment每个ListView项目充气视图时(如此测验中的片段ID中的重复)

有两个解决方案(其中一个来自@ivagarz回答):

1-您只能显示一个YouTubevideo使用ListView上方的YouTubePlayerView进入您的Activity布局但您的Activity必须扩展YouTubeBaseActivity如YouTube Android播放器API文档 (我认为此解决方案无法帮助您解决问题)

2-您可以使用YouTubeThumbnailView显示youtube缩略图将每个项目的video图像转换为ListView使用YouTube上的youtube播放器按钮缩略图图像用于显示video。

喜欢下一张图片:

在此处输入图像描述

用户点击youtube播放器按钮时,你有两种方法:

使用YouTubePlayerSupportFragment 第一个选项:您可以使用YouTubePlayerSupportFragment替换YouTubeThumbnailView如果您选择此选项,您必须:

A-以编程方式添加YouTubePlayerSupportFragment (以避免Fragment ID中的重复)。

B-在ListView只显示一个video作为本课题的答案 。

例如

ListView项的list_item.xml布局:

        

ListView适配器的getView mehtod中:

  public View getView(int position, View convertView, ViewGroup parent) { convertView = inflator.inflate(R.layout.list_item.xml, parent, false); final RelativeLayout relativeLayoutOverYouTubeThumbnailView = (RelativeLayout) convertView.findViewById(R.id.relativeLayout_over_youtube_thumbnail); final YouTubeThumbnailView youTubeThumbnailView = (YouTubeThumbnailView) convertView.findViewById(R.id.youtube_thumbnail); // get parent relative layout RelativeLayout parentRelativeLayout = (RelativeLayout) convertView.findViewById(R.id.parent_relativeLayout); // then create dynamic FrameLayout FrameLayout.LayoutParams dynamicFrameLayoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); final FrameLayout dynamicFrameLayout = new FrameLayout(ctx); dynamicFrameLayout.setId(Different_ID); dynamicFrameLayout.setLayoutParams(dynamicFrameLayoutParams); // then add dynamic FrameLayout as children in parent relative layout parentRelativeLayout.addView(dynamicFrameLayout); ImageView youtubePlayerButton = (ImageView) convertView.findViewById(R.id.btnYoutube_player); youtubePlayerButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { View parentView = (View) v.getParent().getParent(); YouTubeThumbnailView youTubeThumbnailView = (YouTubeThumbnailView) parentView.findViewById(R.id.youtube_thumbnail); RelativeLayout relativeLayoutOverYouTubeThumbnailView = (RelativeLayout) parentView.findViewById(R.id.relativeLayout_over_youtube_thumbnail); youTubeThumbnailView.setVisibility(View.GONE); relativeLayoutOverYouTubeThumbnailView.setVisibility(View.GONE); YouTubeFragment youTubeFragment = new YouTubeFragment(); youTubeFragment.youTubeFragmentInitialize(VideoID, youTubeFragment, parentView); getSupportFragmentManager() .beginTransaction() .replace(dynamicFrameLayout.getId(), youTubeFragment) .commit(); } }); final YouTubeThumbnailLoader.OnThumbnailLoadedListener onThumbnailLoadedListener = new YouTubeThumbnailLoader.OnThumbnailLoadedListener(){ @Override public void onThumbnailError(YouTubeThumbnailView youTubeThumbnailView, YouTubeThumbnailLoader.ErrorReason errorReason) { } @Override public void onThumbnailLoaded(YouTubeThumbnailView youTubeThumbnailView, String s) { loadingImage.setVisibility(View.GONE); youTubeThumbnailView.setVisibility(View.VISIBLE); relativeLayoutOverYouTubeThumbnailView.setVisibility(View.VISIBLE); } }; youTubeThumbnailView.initialize(API_KEY, new YouTubeThumbnailView.OnInitializedListener() { @Override public void onInitializationSuccess(YouTubeThumbnailView youTubeThumbnailView, YouTubeThumbnailLoader youTubeThumbnailLoader) { youTubeThumbnailLoader.setVideo(VideoID); youTubeThumbnailLoader.setOnThumbnailLoadedListener(onThumbnailLoadedListener); } @Override public void onInitializationFailure(YouTubeThumbnailView youTubeThumbnailView, YouTubeInitializationResult youTubeInitializationResult) { } }); } 

我从YouTubePlayerSupportFragment创建了我自己的Fragment扩展:

 public class YouTubeFragment extends YouTubePlayerSupportFragment { public void youTubeFragmentInitialize(final String videoId, final YouTubeFragment fragment, final View parent) { fragment.initialize(apiKey, new YouTubePlayer.OnInitializedListener() { @Override public void onInitializationSuccess(YouTubePlayer.Provider provider, final YouTubePlayer youTubePlayer, boolean wasRestored) { youTubePlayer.setShowFullscreenButton(false); if (!wasRestored) { youTubePlayer.loadVideo(videoId); } } @Override public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) { Log.e("app", youTubeInitializationResult.toString()); } }); } } 

使用YouTubeStandalonePlayer或创建自己的Activity 第二个选项扩展了YouTubeBaseActivity :当用户点击youtube播放器按钮时,您可以创建一个Intent来打开新活动以显示video

 Intent intent = YouTubeStandalonePlayer.createVideoIntent(context, YOUR_DEVELOPER_KEY, VIDEO_ID); startActivity(intent);