【问题标题】:Failing to create more than one YoutubePlayerFragment in the same activity无法在同一活动中创建多个 YoutubePlayerFragment
【发布时间】:2017-03-05 03:40:34
【问题描述】:

活动的相关部分:

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sub_item);


    loadTopico();
 }

 private void loadTopico() {
     YouTubePlayerFragment mainVideo = (YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.main_video);

      mainVideo.initialize(Config.YOUTUBE_API, new YouTubePlayer.OnInitializedListener() {


     @Override
     public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {            
         youTubePlayer.cueVide(getResources().getString(R.string.principal_funcoes));

 }
     @Override
     public void onInitializationFailure(YouTubePlayer.Provider provider,  YouTubeInitializationResult youTubeInitializationResult) {

}
});



    YouTubePlayerFragment secondVideo = (YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.secondVideo);

     secondVideo .initialize(Config.YOUTUBE_API, new YouTubePlayer.OnInitializedListener() {
     @Override
     public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
     youTubePlayer.cueVideo(getResources().getString(R.string.secundario));
 }
    @Override
    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {

}
});

预期的结果是让两个片段各有一个视频,并且彼此独立。

我面临的问题是每个片段都没有视频,也不是独立的。两者一起加载,并且在一个片段中完成的所有操作(按播放或暂停)完全改变了另一个片段中发生的事情。

此活动的计划功能是显示视频供用户按播放并单独观看每个视频,但如上所述,由于片段完全相互破坏,这是不可能的。

我可以做些什么来解决问题?

//编辑 R.layout.activity_sub_item:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="kerooker.me.matematicando.SubItem"
android:id="@+id/mainRelative">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <fragment
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:name="com.google.android.youtube.player.YouTubePlayerFragment"
            android:layout_below="@+id/textoAssista"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="30dp"
            android:id="@+id/main_video" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="@string/texto_assista"
            android:id="@+id/textoAssista"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="25dp"
            android:layout_marginLeft="10dp"
            android:textSize="18sp" />

        <fragment
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:name="com.google.android.youtube.player.YouTubePlayerFragment"
            android:layout_below="@+id/main_video"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="30dp"
            android:id="@+id/secondary_video" />
    </RelativeLayout>

【问题讨论】:

    标签: java android android-fragments youtube-data-api android-youtube-api


    【解决方案1】:

    无论片段如何,您的两个视频当前都使用此 youTubePlayer 实例加载。您可以通过每个YouTubePlayer.OnInitializedListeneronInitializationSuccess 方法使用一个YouTubePlayer 实例。

    我正在更改加载一个 YouTubeFragment 的 loadTopico 方法。相应地更改第二个片段。

    private void loadTopico() {
            YouTubePlayerFragment mainVideo = (YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.main_video);
    
            mainVideo.initialize(Config.YOUTUBE_API, new YouTubePlayer.OnInitializedListener() {
    
                 @Override
                 public abstract void onInitializationSuccess (YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored){
                      player.cueVideo(getResources().getString(R.string.principal_funcoes));
                 }                                     
    
                 @Override
                 public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
    
                 }
           });
    }
    

    更新

    好的,所以,我已经进行了一些挖掘,显然您无法初始化 YouTubePlayerFragment 的多个实例,因为它在后台使用单例模式,这基本上意味着如果您要实例化多个 YouTubePlayerFragment 对象,您只需最终有两次相同的实例。因此,您在所有实例中看到相同行为的原因。

    解决方法是不要一次实例化多个 YouTubePlayerFragment 实例。相反,仅在需要时才初始化它们。

    请参阅 thisthis 了解更多信息。

    【讨论】:

    • 但是两个Fragment都有自己的OnInitializedListener,youtubeplayer的实例怎么可能一样呢?
    • 抱歉,我的代码有点不对劲。我把它编辑了,所以它和我的java代码完全一样。问题依然存在。
    • 这很奇怪。 R.layout.activity_sub_item的代码也能发一下吗?
    • youtube播放器好像不是独立的,当我在其中一个中按“播放”时,另一个也有反应
    • 确实违反直觉
    猜你喜欢
    • 2020-02-12
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    相关资源
    最近更新 更多