2017-08-30 46 views
0

大家好我现在正在我的应用程序中集成YouTube API,我必须从API解析视频ID的列表,然后我必须在列表视图中显示视频当我们点击它的视频已被播放直到这工作得很好玩你管你的管子通道不玩横向模式

当用户选择全屏模式是横向模式,我得到了一些错误后有

public final class VideoGallery extends Fragment implements OnFullscreenListener { 

    public static Context context; 
    public static final int ANIMATION_DURATION_MILLIS = 300; 
    public static final int LANDSCAPE_VIDEO_PADDING_DP = 5; 
    public final int RECOVERY_DIALOG_REQUEST = 1; 
    public static VideoListFragment listFragment; 
    public static VideoFragment videoFragment; 
    View videoBox; 
    View view; 
    View closeButton; 
    boolean isFullscreen; 
    public static YouTubePlayer.OnFullscreenListener onFullscreenListener; 
    static boolean back = false; 
    FrameLayout relativeLayout; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     context = getContext(); 
     onFullscreenListener = this; 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     relativeLayout = new FrameLayout(getActivity()); 
     inflater.inflate(R.layout.video_list_demo, relativeLayout, true); 
     MainActivity.headerText.setText("Video Gallery"); 
     listFragment = (VideoGallery.VideoListFragment) getChildFragmentManager().findFragmentById(R.id.list_fragment); 
     videoFragment = (VideoGallery.VideoFragment) getActivity().getFragmentManager().findFragmentById(R.id.video_fragment_container); 

     videoBox = relativeLayout.findViewById(R.id.video_box); 
     closeButton = relativeLayout.findViewById(R.id.close_button); 
     closeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       listFragment.getListView().clearChoices(); 
       listFragment.getListView().requestLayout(); 
       videoFragment.pause(); 
       ViewPropertyAnimator animator = videoBox.animate() 
         .translationYBy(videoBox.getHeight()) 
         .setDuration(ANIMATION_DURATION_MILLIS); 
       runOnAnimationEnd(animator, new Runnable() { 
        @Override 
        public void run() { 
         videoBox.setVisibility(View.INVISIBLE); 
        } 
       }); 
      } 
     }); 
     videoBox.setVisibility(View.INVISIBLE); 

     layout(); 

     checkYouTubeApi(); 

     return relativeLayout; 
    } 

    private void checkYouTubeApi() { 
     YouTubeInitializationResult errorReason = 
       YouTubeApiServiceUtil.isYouTubeApiServiceAvailable(context); 
     if (errorReason.isUserRecoverableError()) { 
      errorReason.getErrorDialog(getActivity(), RECOVERY_DIALOG_REQUEST).show(); 
     } else if (errorReason != YouTubeInitializationResult.SUCCESS) { 
      String errorMessage = 
        String.format(getString(R.string.error_player), errorReason.toString()); 
      Toast.makeText(context, errorMessage, Toast.LENGTH_LONG).show(); 
     } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == RECOVERY_DIALOG_REQUEST) { 
      // Recreate the activity if user performed a recovery action 
      getActivity().recreate(); 
     } 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     layout(); 
    } 

    @Override 
    public void onFullscreen(boolean isFullscreen) { 
     this.isFullscreen = isFullscreen; 
     layout(); 
    } 

    private void layout() { 
     boolean isPortrait = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; 
     listFragment.getView().setVisibility(isFullscreen ? View.GONE : View.VISIBLE); 
     listFragment.setLabelVisibility(isPortrait); 
     closeButton.setVisibility(isPortrait ? View.VISIBLE : View.GONE); 

     if (isFullscreen) { 
      videoBox.setTranslationY(0); // Reset any translation that was applied in portrait. 
      setLayoutSize(videoFragment.getView(), MATCH_PARENT, MATCH_PARENT); 
      setLayoutSizeAndGravity(videoBox, MATCH_PARENT, MATCH_PARENT, Gravity.TOP | Gravity.LEFT); 
     } else if (isPortrait) { 
      setLayoutSize(listFragment.getView(), MATCH_PARENT, MATCH_PARENT); 
      setLayoutSize(videoFragment.getView(), MATCH_PARENT, WRAP_CONTENT); 
      setLayoutSizeAndGravity(videoBox, MATCH_PARENT, WRAP_CONTENT, Gravity.BOTTOM); 
     } else { 
      videoBox.setTranslationY(0); // Reset any translation that was applied in portrait. 
      int screenWidth = dpToPx(getResources().getConfiguration().screenWidthDp); 
      setLayoutSize(listFragment.getView(), screenWidth/4, MATCH_PARENT); 
      int videoWidth = screenWidth - screenWidth/4; 
      setLayoutSize(videoFragment.getView(), videoWidth, WRAP_CONTENT); 
      setLayoutSizeAndGravity(videoBox, videoWidth, WRAP_CONTENT, 
        Gravity.RIGHT | Gravity.CENTER_VERTICAL); 
     } 


    } 

    @TargetApi(16) 
    private void runOnAnimationEnd(ViewPropertyAnimator animator, final Runnable runnable) { 
     if (Build.VERSION.SDK_INT >= 16) { 
      animator.withEndAction(runnable); 
     } else { 
      animator.setListener(new AnimatorListenerAdapter() { 
       @Override 
       public void onAnimationEnd(Animator animation) { 
        runnable.run(); 
       } 
      }); 
     } 
    } 

    public static final class VideoListFragment extends ListFragment { 

     private static List<VideoEntry> VIDEO_LIST; 
     private PageAdapter adapter; 
     private View videoBox; 

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

     } 

     private void callApi() { 
      new DoGet(this, "videogallery").execute(WebserviceEndpoints.VIDEO_GALLERY); 
     } 

     public void handleVideoGalleryResponse(String response) { 
      try { 
       List<VideoEntry> list = new ArrayList<VideoEntry>(); 
       if (response.length() > 0) { 
        JSONObject jsonObject = new JSONObject(response); 
        JSONArray array = jsonObject.optJSONArray("items"); 
        for (int i = 0; i < array.length(); i++) { 
         JSONObject data = array.optJSONObject(i); 
         JSONObject obj = data.optJSONObject("id"); 
         JSONObject obj1 = data.optJSONObject("snippet"); 
         String videoId = obj.optString("videoId"); 
         String videoTitle = obj1.getString("title"); 
         if (!videoId.equals("")) { 
          list.add(new VideoEntry(videoTitle, videoId)); 
         } 
        } 
        VIDEO_LIST = Collections.unmodifiableList(list); 
        adapter = new PageAdapter(getActivity(), VIDEO_LIST); 
        setListAdapter(adapter); 
       } 
      } catch (Exception e) { 
       Log.d("", "handleResponse: ", e); 
      } 
     } 

     @Override 
     public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState); 
      getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
      videoBox = getActivity().findViewById(R.id.video_box); 
     } 

     @Override 
     public void onListItemClick(ListView l, View v, int position, long id) { 
      String videoId = VIDEO_LIST.get(position).videoId; 
      back = false; 
      VideoFragment videoFragment = (VideoFragment) getActivity().getFragmentManager().findFragmentById(R.id.video_fragment_container); 
      videoFragment.setVideoId(videoId); 
      if (videoBox.getVisibility() != View.VISIBLE) { 
       if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 
        videoBox.setTranslationY(videoBox.getHeight()); 
       } 
       videoBox.setVisibility(View.VISIBLE); 
      } 
      if (videoBox.getTranslationY() > 0) { 
       videoBox.animate().translationY(0).setDuration(ANIMATION_DURATION_MILLIS); 
      } 
     } 

     @Override 
     public void onDestroyView() { 
      super.onDestroyView(); 

      VideoFragment f = (VideoFragment) getActivity().getFragmentManager().findFragmentById(R.id.video_fragment_container); 
      if (f != null) 
       getActivity().getFragmentManager().beginTransaction().remove(f).commit(); 
      if (adapter != null) 
       adapter.releaseLoaders(); 
     } 

     public void setLabelVisibility(boolean visible) { 
      if (adapter != null) 
       adapter.setLabelVisibility(visible); 
     } 
    } 

    private static final class PageAdapter extends BaseAdapter { 

     private final List<VideoEntry> entries; 
     private final List<View> entryViews; 
     private final Map<YouTubeThumbnailView, YouTubeThumbnailLoader> thumbnailViewToLoaderMap; 
     private final LayoutInflater inflater; 
     private final ThumbnailListener thumbnailListener; 

     private boolean labelsVisible; 

     public PageAdapter(Context context, List<VideoEntry> entries) { 
      this.entries = entries; 

      entryViews = new ArrayList<View>(); 
      thumbnailViewToLoaderMap = new HashMap<YouTubeThumbnailView, YouTubeThumbnailLoader>(); 
      inflater = LayoutInflater.from(context); 
      thumbnailListener = new ThumbnailListener(); 

      labelsVisible = true; 
     } 

     public void releaseLoaders() { 
      for (YouTubeThumbnailLoader loader : thumbnailViewToLoaderMap.values()) { 
       loader.release(); 
      } 
     } 

     public void setLabelVisibility(boolean visible) { 
      labelsVisible = visible; 
      for (View view : entryViews) { 
       view.findViewById(R.id.text).setVisibility(visible ? View.VISIBLE : View.GONE); 
      } 
     } 

     @Override 
     public int getCount() { 
      return entries.size(); 
     } 

     @Override 
     public VideoEntry getItem(int position) { 
      return entries.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return 0; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View view = convertView; 
      VideoEntry entry = entries.get(position); 

      // There are three cases here 
      if (view == null) { 
       // 1) The view has not yet been created - we need to initialize the YouTubeThumbnailView. 
       view = inflater.inflate(R.layout.video_list_item, parent, false); 
       YouTubeThumbnailView thumbnail = (YouTubeThumbnailView) view.findViewById(R.id.thumbnail); 
       thumbnail.setTag(entry.videoId); 
       thumbnail.initialize("AIzaSyB8BPeIbu5T1-flG4tpEdrHDPI3Rk2VTDY", thumbnailListener); 
      } else { 
       YouTubeThumbnailView thumbnail = (YouTubeThumbnailView) view.findViewById(R.id.thumbnail); 
       YouTubeThumbnailLoader loader = thumbnailViewToLoaderMap.get(thumbnail); 
       if (loader == null) { 
        // 2) The view is already created, and is currently being initialized. We store the 
        // current videoId in the tag. 
        thumbnail.setTag(entry.videoId); 
       } else { 
        // 3) The view is already created and already initialized. Simply set the right videoId 
        // on the loader. 
        thumbnail.setImageResource(R.drawable.no_thumbnail); 
        loader.setVideo(entry.videoId); 
       } 
      } 
      TextView label = ((TextView) view.findViewById(R.id.text)); 
      label.setText(entry.text); 
      label.setVisibility(labelsVisible ? View.VISIBLE : View.GONE); 
      return view; 
     } 

     private final class ThumbnailListener implements 
       YouTubeThumbnailView.OnInitializedListener, 
       YouTubeThumbnailLoader.OnThumbnailLoadedListener { 

      @Override 
      public void onInitializationSuccess(
        YouTubeThumbnailView view, YouTubeThumbnailLoader loader) { 
       loader.setOnThumbnailLoadedListener(this); 
       thumbnailViewToLoaderMap.put(view, loader); 
       view.setImageResource(R.drawable.no_thumbnail); 
       String videoId = (String) view.getTag(); 
       loader.setVideo(videoId); 
      } 

      @Override 
      public void onInitializationFailure(
        YouTubeThumbnailView view, YouTubeInitializationResult loader) { 
       view.setImageResource(R.drawable.no_thumbnail); 
      } 

      @Override 
      public void onThumbnailLoaded(YouTubeThumbnailView view, String videoId) { 
      } 

      @Override 
      public void onThumbnailError(YouTubeThumbnailView view, YouTubeThumbnailLoader.ErrorReason errorReason) { 
       view.setImageResource(R.drawable.no_thumbnail); 
      } 
     } 

    } 

    public static final class VideoFragment extends YouTubePlayerFragment 
      implements YouTubePlayer.OnInitializedListener { 

     private YouTubePlayer player; 
     private String videoId; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      initialize("AIzaSyB8BPeIbu5T1-flG4tpEdrHDPI3Rk2VTDY", this); 
     } 

     @Override 
     public void onDestroy() { 
      if (player != null) { 
       player.release(); 
      } 
      super.onDestroy(); 
     } 

     public void setVideoId(String videoId) { 
      if (videoId != null && !videoId.equals(this.videoId)) { 
       this.videoId = videoId; 
       if (player != null) { 
        player.cueVideo(videoId); 
       } 
      } 
     } 

     public void pause() { 
      if (player != null) { 
       player.pause(); 
      } 
     } 

     @Override 
     public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean restored) { 
      this.player = player; 
      player.addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_CUSTOM_LAYOUT); 
      player.setOnFullscreenListener(onFullscreenListener); 
      if (!restored && videoId != null) { 
       player.cueVideo(videoId); 
      } 
     } 

     @Override 
     public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult result) { 
      this.player = null; 
     } 

    } 

    private static final class VideoEntry { 
     private final String text; 
     private final String videoId; 

     public VideoEntry(String text, String videoId) { 
      this.text = text; 
      this.videoId = videoId; 
     } 
    } 

    private int dpToPx(int dp) { 
     return (int) (dp * getResources().getDisplayMetrics().density + 0.5f); 
    } 

    private static void setLayoutSize(View view, int width, int height) { 
     ViewGroup.LayoutParams params = view.getLayoutParams(); 
     params.width = width; 
     params.height = height; 
     view.setLayoutParams(params); 
    } 

    private static void setLayoutSizeAndGravity(View view, int width, int height, int gravity) { 
     FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams(); 
     params.width = width; 
     params.height = height; 
     params.gravity = gravity; 
     view.setLayoutParams(params); 
    } 
} 

这是我的片段

的布局文件是

<merge xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <fragment 
     android:id="@+id/list_fragment" 
     class="com.mycristoparish.Fragments.VideoGallery$VideoListFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginTop="?attr/actionBarSize" /> 

    <LinearLayout 
     android:id="@+id/video_box" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     android:orientation="vertical"> 

     <ImageButton 
      android:id="@+id/close_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:src="@android:drawable/btn_dialog" /> 

     <fragment 
      android:id="@+id/video_fragment_container" 
      class="com.mycristoparish.Fragments.VideoGallery$VideoFragment" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

    </LinearLayout> 

</merge> 

当我尝试播放全屏模式下的视频我收到以下错误

java.lang.IllegalArgumentException: Binary XML file line #42: Duplicate id 0x7f0d0117, tag null, or parent id 0x7f0d0115 with another fragment for com.mycristoparish.Fragments.VideoGallery$VideoFragment 

请指导我如何进一步移动。

在此先感谢。

回答

2

问题是你正在用片段内的片段膨胀一个布局。你不能这样做,所以你得到错误。但是你可以动态地添加它们。

More details

注:不能充气布局成片段时布局包括。只有在动态添加到片段时才支持嵌套片段。

+0

同样的例子工作正常,如果我尝试它与活动,而不是片段 – Jeyaseelan

+0

这就是我说的,你不能在一个fragment.You可以做一个活动。 –