2014-09-02 46 views
1

在我的活动中,我有一个viewPager例如3页。 在所有这些页面中,我有一个带有不同ID视频的YouTubePlayer。ViewPager和YouTubePlayer

问题是所有的YouTubePlayer组件都有相同的视频。

具体:

当显示第一页时,YouTubePlayer显示第一视频,因此所有的似乎是确定。 当我尝试滚动到第2页时,我可以看到第2个YouTubePlayer显示相同的视频。 第二页完全显示(滚动后)时,查看传呼机后面准备第3页。因此,在第3页上,第3个ID视频设置为YouTubePlayer组件。此时当前显示的第2页自动切换到第3段视频。

就好像YouTubePlayer的实例对所有页面都是单一的。 但是在每一页新的FragmentYouTubePlayer()被正确调用。

我不明白问题在哪里。 最后,我想知道是否可以同时使用多个YouTubePlayer组件(在viewpager中)?

感谢您的帮助。

+0

你有没有解决过这个问题?我刚刚碰到同样的问题 – Cris 2015-08-27 00:09:08

+0

下面我的回答,希望它能解决你的问题! – gduh 2015-08-27 09:30:54

回答

3

我不记得确切是什么错,但是,我解决了我的问题。所以,如果它可以帮助你,这里是代码:

在我的主要活动,使用PagerAdapter:

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
    public ScreenSlidePagerAdapter(android.support.v4.app.FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public android.support.v4.app.Fragment getItem(int position) { 
     fragmentYouTubeContent = FragmentYouTubeContent.create(position); 
     return fragmentYouTubeContent; 
    } 

    @Override 
    public int getCount() { 
     int nb = 3; 
     return nb; 
    } 
} 

我FragmentYouTubeContent.class

package com.orange.OrangeJobs; 


import java.util.List; 

import com.google.android.youtube.player.YouTubeInitializationResult; 
import com.google.android.youtube.player.YouTubeStandalonePlayer; 
import com.google.android.youtube.player.YouTubeThumbnailLoader; 
import com.google.android.youtube.player.YouTubeThumbnailView; 


import android.support.v4.app.Fragment; 
import android.annotation.SuppressLint; 
import android.app.Dialog; 
import android.content.Intent; 
import android.content.pm.ResolveInfo; 
import android.content.res.Configuration; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.FrameLayout; 
import android.widget.TextView; 
import android.widget.Toast; 


public class FragmentYouTubeContent extends Fragment implements YouTubeThumbnailView.OnInitializedListener { 

     public static final int REQ_START_STANDALONE_PLAYER = 101; 
     private static final int REQ_RESOLVE_SERVICE_MISSING = 2; 
     private static final int RECOVERY_DIALOG_REQUEST = 1; 

    /** 
    * The fragment's page number. 
    */ 
    private int mPageNumber; 
    private String urlYouTube; 
    private boolean canHideStatusBar = false; 
    private Dialog errorDialog; 
    FrameLayout rl; 
    private YouTubeThumbnailView thumbnailView; 

    /** 
    * Factory method for this fragment class. Constructs a new fragment for the given page number. 
    */ 
    public static FragmentYouTubeContent create(int pageNumber) { 
     FragmentYouTubeContent fragment = new FragmentYouTubeContent(); 
     fragment.setPageNumber(pageNumber); 
     return fragment; 
    } 

    public FragmentYouTubeContent() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @SuppressLint("InlinedApi") 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     setRetainInstance(true); 
     ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.youtube, container, false); 
     urlYouTube = "YOUR_VIDEO_URL"; 
     if (!"".equals(urlYouTube)) { 
      thumbnailView = (YouTubeThumbnailView) rootView.findViewById(R.id.youtubethumbnailview); 
      thumbnailView.initialize(Params.YOUTUBE_KEY, this); 
      thumbnailView.setOnClickListener(new OnClickListener(){ 
       @Override 
       public void onClick(View arg0) { 
        // Launch standalone YoutTube player 
        Intent intent = null; 
        intent = YouTubeStandalonePlayer.createVideoIntent(getActivity(), YOUTUBE_KEY, urlYouTube, 0, true, false); 
        if (intent != null) { 
         if (canResolveIntent(intent)) { 
          canHideStatusBar = true; 
          startActivityForResult(intent, REQ_START_STANDALONE_PLAYER); 
         } else { 
          // Could not resolve the intent - must need to install or update the YouTube API service. 
          YouTubeInitializationResult 
           .SERVICE_MISSING 
           .getErrorDialog(getActivity(), REQ_RESOLVE_SERVICE_MISSING).show(); 
         } 
        } 
       }}); 
     } 
     return rootView; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     boolean isLandscape = false; 
     int currentOrientation = getResources().getConfiguration().orientation; 
     if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) { 
      isLandscape = true; 
     } 
     else { 
      isLandscape = false; 
     }   
     if (canHideStatusBar && this.isVisible() && isLandscape) { 
      Utils.hideStatusBar(getActivity()); 
      canHideStatusBar = false; 
     } 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
    }  


    @Override 
    public void onInitializationSuccess(YouTubeThumbnailView thumbnailView, YouTubeThumbnailLoader thumbnailLoader) { 
     thumbnailLoader.setVideo(urlYouTube); 
    } 

    @Override 
    public void onInitializationFailure(YouTubeThumbnailView thumbnailView, YouTubeInitializationResult errorReason) { 
     if (errorReason.isUserRecoverableError()) { 
      if (errorDialog == null || !errorDialog.isShowing()) { 
       errorDialog = errorReason.getErrorDialog(getActivity(), RECOVERY_DIALOG_REQUEST); 
       errorDialog.show(); 
      } 
      } else { 
      String errorMessage = String.format(getString(R.string.error_thumbnail_view), errorReason.toString()); 
      Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_LONG).show(); 
      } 
    } 

    // ***** Private methods ************************************************************************************* 

    private boolean canResolveIntent(Intent intent) { 
     List<ResolveInfo> resolveInfo = getActivity().getPackageManager().queryIntentActivities(intent, 0); 
     return resolveInfo != null && !resolveInfo.isEmpty(); 
    } 

    // ***** Properties methods ************************************************************************************* 
    /** 
    * Returns the page number represented by this fragment object. 
    */ 
    public int getPageNumber() { 
     return mPageNumber; 
    } 

    /** 
    * @param pageNumber the pageNumber to set 
    */ 
    public void setPageNumber(int pageNumber) { 
     this.mPageNumber = pageNumber; 
    } 

    /** 
    * @return the canHideStatusBar 
    */ 
    public boolean isCanHideStatusBar() { 
     return canHideStatusBar; 
    } 

    /** 
    * @param canHideStatusBar the canHideStatusBar to set 
    */ 
    public void setCanHideStatusBar(boolean canHideStatusBar) { 
     this.canHideStatusBar = canHideStatusBar; 
    } 

} 

我的布局:youtube.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:clipToPadding="false" 
       android:background="@color/black" 
       android:scrollbarStyle="outsideOverlay" 
       android:orientation="horizontal" > 


    <com.google.android.youtube.player.YouTubeThumbnailView 
       android:id="@+id/youtubethumbnailview" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" />  

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:contentDescription="@string/empty_string" 
     android:src="@drawable/ic_media_embed_play"   
    /> 

</RelativeLayout> 
+0

感谢发布。它不直接解决我的问题(我需要一个播放器,而不仅仅是缩略图,嵌入在ViewPager中),但无疑会帮助其他人。 – Cris 2015-08-28 01:38:39

+0

我并不理解你的需求,但源代码不只是一个缩略图。好的,首先它会显示一个缩略图,但如果用户触摸它,则会开始播放视频。 – gduh 2015-08-28 08:19:33

+0

当然,但您正在使用独立播放器。我需要我的视频在ViewPager布局中播放,所以我使用的是YoutubePlayerSupportFragment。不幸的是,这在ViewPager中似乎有不可克服的问题。 – Cris 2015-08-29 01:14:04