在片段内部的返回按钮上关闭Youtube播放器全屏模式

7

我正在使用平板电脑中的主从布局,在左侧有几个按钮可以打开多个片段,其中一个片段包含了Youtube播放器。

问题:

当Youtube播放器全屏时,按下返回键会调用activityonBackPressed方法,导致整个活动被关闭。

我尝试过的:

1. 为父片段(包含Youtube片段)添加键盘事件监听器,并在点击“返回”键时进行处理,但是只有当播放器没有全屏时才会调用此监听器,否则不会调用;

rootView.setFocusableInTouchMode(true);
        rootView.requestFocus();
        rootView.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
                    try {
                        // Close full screen
                        return true;
                    } catch (Exception e) {
                        AHHExceptionHandler.handleException(e);
                    }
                }
                return false;
            }
        });

2- 添加了 onKeyListener 到 youtubeFragment 视图,以检查其是否处于全屏模式,然后关闭全屏模式。

youTubeFragment.getView().setFocusableInTouchMode(true);
youTubeFragment.getView().requestFocus();
    youTubeFragment.getView().setOnKeyListener(new View.OnKeyListener() {
                                                @Override
                                                public boolean onKey(View v, int keyCode, KeyEvent event) {
                                                    if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
                                                        try {
                                                            youTubePlayer.setFullscreen(false);
                                                            return true;
                                                        } catch (Exception e) {
                                                            AHHExceptionHandler.handleException(e);
                                                        }
                                                    }
                                                    return false;
                                                }
                                            });

这并非在所有情况下都称为。

当 YouTube 播放器处于全屏状态时,我需要处理硬件返回按钮,然后关闭全屏模式,使应用程序恢复其先前的状态。

谢谢。

编辑1: - 我想在片段内处理此问题,而不是在父 Activity 中处理它。虽然我已经在父 Activity 中处理了它,但我不喜欢这种解决方案。


除了您在此处描述的方式或在Activity onBackPressed中添加特定于youtube的代码,您是否找到了解决方法? - ashishduh
1
不,我找不到另一种解决方案。 - Omar HossamEldin
2个回答

5

补充安德烈的回复:

在您的父 Activity 中添加:

public YouTubePlayer youTubePlayer;
public boolean isYouTubePlayerFullScreen;

在你的片段中添加:

MainActivity mainActivity = (MainActivity) getActivity();

然后,在初始化YouTubePlayerFragment时:
    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean b) {
        mainActivity.youTubePlayer = player;
        player.loadVideo(videoId);

        player.setOnFullscreenListener(new YouTubePlayer.OnFullscreenListener() {
            @Override
            public void onFullscreen(boolean b) {
                mainActivity.isYouTubePlayerFullScreen = b;
            }
        });

    }

现在您的Activity可以访问YouTubePlayer并获取播放器是否全屏的信息。
接下来,在您的Activity中,重写onBackPressed方法,如下所示:
@Override
public void onBackPressed() {
    if (youTubePlayer != null && isYouTubePlayerFullScreen){
            youTubePlayer.setFullscreen(false);
    } else {
        super.onBackPressed();
    }
}

这个程序相关的内容翻译成中文:公共变量youTubePlayer和isYouTubePlayerFullScreen缺少静态修饰符。 - Emad Morris Zedan
@EmadMorrisZedan,请详细说明为什么它们必须是静态的。 - Valeriya
太棒了,谢谢你的回答。 同时,您需要在清单文件中添加以下内容:<activity android:name=".MainActivity" android:configChanges="orientation|screenSize" android:screenOrientation="portrait"> - tej shah

4

您可以在活动中覆盖onBackPressed(),并在播放器处于全屏模式时按如下方式处理:

@Override
public void onBackPressed() {

    if (youtubePlayer != null && isFullscreen) {
        // if fullscreen, set fullscreen false
        youtubePlayer.setFullscreen(false);

    } else {
        // if NOT fullscreen, perform default call on back press
        super.onBackPressed();
    }
}
在上面的代码片段中,isFullscreen 是我们活动的实例变量,并且从 OnFullscreenListener 中同步到 youtubePlayer 的状态,该监听器通过 youtubePlayer.setOnFullScreenListener() 设置。希望这样讲清楚了 :)

该活动与YouTube播放器无关,YouTube播放器在片段内部,我不想在活动中处理此问题。我需要尽可能使代码独立。 - Omar HossamEldin
Youtube播放器与活动的上下文有关。祝你好运,找到你想要的东西。 - Andre Classen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接