ListView项目中的YouTubePlayerSupportFragment为null

Wen*_*ger 5 android youtube-api android-fragments

我正在尝试YouTubePlayerSupportFragmentListView项目中使用a .该ListView是里面Fragment那是在Activity.由于存在嵌套片段,我正在使用该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());
}
Run Code Online (Sandbox Code Playgroud)

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <include layout="@layout/post_base_layout" />

    <fragment
        android:name="com.google.android.youtube.player.YouTubePlayerSupportFragment"
        android:id="@+id/youtube_video"
        android:layout_width="match_parent"
        android:layout_height="240dp"
        android:layout_marginLeft="62dp"
        android:layout_marginRight="32dp"
        android:background="@color/light_grey"
        android:cropToPadding="true"
        android:padding="1dp"
        android:scaleType="centerCrop" />

    <include layout="@layout/post_bottom_layout" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

问题是,当我尝试通过findFragmentById()从XML获取它来创建片段时,它返回null,这就是发布到堆栈跟踪的内容.

我正在尝试关注YouTube API示例并对嵌套片段进行更改,但我无法找出导致问题的原因.

iva*_*arz 3

您所采取的整个方法存在问题。

首先,不支持直接从 XML 扩充子片段。嵌套片段时,必须getChildFragmentManager在父片段中动态添加它们。

其次,即使它有效(在某些情况下可能有效),您也已经膨胀了视图,但没有将其添加到实际片段的布局中。这就是该方法中第二个和第三个参数的inflate用途。将FragmentManager在其当前布局中查找片段,或在后台堆栈中查找事件,但无法找到在随机 XML 中膨胀且从未使用的片段。

最后,也是最重要的,您永远不应该将片段添加为ListView. 片段期望有一个与它们所在的 Activity 相关的生命周期,而ListView或任何AdapterView一般片段将根据需要创建、销毁和回收其子级。

可能的解决方案:

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

  • 如果你真的需要View回收,也许你可以不用每一行的实时视频?考虑在行中使用YouTubeThumbnailViewYoutubeFragment ,然后将用户重定向到另一个活动/在布局上列表外部的单个活动中加载视频。

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