【问题标题】:YouTubePlayer -how to handle click listener?YouTubePlayer - 如何处理点击监听器?
【发布时间】:2018-06-22 18:51:27
【问题描述】:

我有一个在那里播放视频的布局,我想在这个播放器上处理 onClick。在我的线性布局中,我有他们 api 中建议的 youtube 片段:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment        
        android:name="com.google.android.youtube.player.YouTubePlayerFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/youtubePlayerFragment"/>
</LinearLayout>

然后我在我的 Activity 中访问这个片段:

mYouTubePlayerFragment = (YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.youtubePlayerFragment);

然后我初始化它:

    mYouTubePlayerFragment.initialize(CategoriesTabsData.DEVELOPER_KEY, new com.google.android.youtube.player.YouTubePlayer.OnInitializedListener() {
        @Override
        public void onInitializationSuccess(com.google.android.youtube.player.YouTubePlayer.Provider provider, com.google.android.youtube.player.YouTubePlayer youTubePlayer, boolean b) {
             // loading the video                
        }

        @Override
        public void onInitializationFailure(com.google.android.youtube.player.YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {

        }
    });

我想在点击播放器时将“点击”打印到 Log.d。因此,当播放视频并单击/触摸其播放器时,我想将“单击”打印到日志

我正在尝试处理对播放器的点击(我在 onInitializationSuccess 中获得了 youtubeplayer 对象)但我没有成功。

我试过了:

    mYouTubePlayerFragment.getView().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("youtube", "click");
        }
    });

但它没有到达 onClick。然后我尝试创建扩展 YouTubePlayerFragment 并实现 View.OnClickListener 的 MyYouTubePlayerFragment,因此我在我的 xml 中使用适当的名称 (com.mypackagename.MyYouTubePlayerFragment) 设置片段并将 mYouTubePlayerFragment 的类型设置为 MyYouTubePlayerFragment 但它没有到达 onClick。

如何“捕捉”视频的点击?

【问题讨论】:

  • 当我添加dispatchTouchEvent时,当播放器全屏并且我触摸它时,它不会到达此代码。只有当播放器尺寸较小时,它才会识别我的点击
  • 这意味着播放器与播放器开始全屏活动,或者它是不同的视图
  • 播放器全屏启动,它位于一个片段中,名称为:android:name="com.google.android.youtube.player.YouTubePlayerFragment"。那么我不应该以全屏方式启动它吗?我怎么知道点击的是播放器而不是下面的布局?
  • 您是否尝试在 LinearLayout 中添加点击监听器?

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


【解决方案1】:

我认为您应该将 YouTubeSupportFragment 和 add 扩展到您的 YoutubePlayer(在 onInitializationSuccess 方法中)YouTubePlayer.PlaybackEventListener。

您可能对 onPaused() 和 onPlaying() 方法感兴趣。

例子:

@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
    youTubePlayer = player;
    if (!wasRestored) {
        youTubePlayer.setPlaybackEventListener(new YouTubePlayer.PlaybackEventListener() {
            @Override
            public void onPlaying() {

            }

            @Override
            public void onPaused() {

            }

            @Override
            public void onStopped() {

            }

            @Override
            public void onBuffering(boolean b) {

            }

            @Override
            public void onSeekTo(int i) {

            }
        });
        youTubePlayer.cueVideo(currentVideoID, 0);
    }
}

【讨论】:

  • 否,因为我想识别播放器上的任何点击(不仅仅是停止\播放)。所以即使用户按下播放器并且它没有停止视频,我也想识别它。
【解决方案2】:

尝试像这样扩展YouTubeSupportFragment 并覆盖onCreateView 方法:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = super.onCreateView(inflater, container, savedInstanceState);

    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("youtube", "click");
        }
    });

    return view;
}

【讨论】:

    【解决方案3】:

    因此,要在父视图中收听点击事件,您应该将点击事件从子视图传递给父视图。在 google documentation 中,很少有方法可以做到这一点,并且有一些用于更高级别视图(如 Activity、Fragment、ViewGroup、ViewParent)的辅助方法:

    还有一些您应该注意的其他方法,它们是 不是 View 类的一部分,但可以直接影响你的方式 能够处理事件。因此,当在一个内部管理更复杂的事件时 布局,请考虑以下其他方法:

    Activity.dispatchTouchEvent(MotionEvent) - 这允许您的活动 拦截所有触摸事件,然后再将它们分派到 窗户。

    ViewGroup.onInterceptTouchEvent(MotionEvent) - 这允许一个 ViewGroup 在事件被分派到子视图时观察它们。

    ViewParent.requestDisallowInterceptTouchEvent(boolean) - 打电话给这个 在父视图上指示它不应拦截触摸 带有 onInterceptTouchEvent(MotionEvent) 的事件。

    【讨论】:

      【解决方案4】:

      我遇到了这样的事情,最终创建了一个包装器视图来拦截触摸事件。

      也许你可以这样做:

      public class YourYouTubePlayerSupportFragment extends YouTubePlayerSupportFragment {
      
      @Override
      public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
          YouTubePlayerView youTubePlayerView = (YouTubePlayerView) super.onCreateView(layoutInflater, viewGroup, bundle);
          final FrameLayout wrapper = new FrameLayout(getActivity()) {
      
              private GestureDetector gestureDetector;
              private GestureDetector.SimpleOnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() {
                        @Override
                        public boolean onSingleTapConfirmed(MotionEvent e) {
                              //do what you need to here
                              return super.onSingleTapConfirmed(e);
                        }
                   };
      
              @Override
              public boolean onInterceptTouchEvent(MotionEvent ev) {
                  if (gestureDetector == null) {
                      gestureDetector = new GestureDetector(getContext(), gestureListener);
                  }
                  return gestureDetector.onTouchEvent(ev);
              }
          };
      
          FrameLayout.LayoutParams viewLp = new FrameLayout.LayoutParams(
                  ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
          wrapper.addView(youTubePlayerView, viewLp);
          return wrapper;
      }
      
      }
      

      【讨论】:

      • 它会导致非法状态异常,原因是我应该从视图的父级调用 removeview 但 view.getParent() 为空
      • viewGroup 是片段视图的父视图。不要在片段范围内使用它。我没有看到 return 语句,你能修改它以便编译吗?
      • 有点匆忙,忘记清理一些代码。我刚刚编辑了它。检查一下,如果它不起作用,我可能会在新项目中尝试它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-21
      • 1970-01-01
      • 2015-06-08
      • 2019-11-25
      相关资源
      最近更新 更多