2017-08-30 8 views
0

こんにちはすべて私は今あなたのAPIにビデオIDのリストを解析しなければならない私のアプリにYouTube APIを統合していますこれはそこ罰金あなたからtube apiを再生するlandscapeチャンネルで再生していないチューブチャンネル

を動作するまで、ユーザは風景モードでフルスクリーンモードを選択したときに、私はいくつかのエラー

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

私は何を言っているのでしょうか?断片でそれを行うことはできません。アクティビティで行うことができます。 –

関連する問題