Android后退按钮和MediaController

Ron*_*nie 27 android back-button back mediacontroller

我知道如何控制后退按钮.我有一个VideoView嵌入式FrameLayout.我的问题是当视频弹出时,视频控件会出现几秒钟.在可见时按下后退按钮会隐藏视频控件.有没有办法忽略该功能并执行下一步后退操作,就好像视频控件不可见?

我问的原因是,如果我真的想要回去,我必须按两次后退按钮; 一次隐藏控件,第二次实际返回

Com*_*are 31

根据源代码,这应该工作:

  1. 扩展MediaController(为了这个答案的目的,称之为RonnieMediaController)
  2. 覆盖dispatchKeyEvent()RonnieMediaController
  3. 在链接到超类之前,请检查KeyEvent.KEYCODE_BACK,如果遇到这种情况,请告诉您的活动finish()
  4. RonnieMediaController而不是MediaController用你的VideoView

就个人而言,我只是不管它,因为这个改变你的用户无法RonnieMediaController按需消失.


Ser*_*Him 17

你可以简单地写:

mVideoView.setMediaController(new MediaController(this){
        public boolean dispatchKeyEvent(KeyEvent event)
        {
            if (event.getKeyCode() == KeyEvent.KEYCODE_BACK)
                ((Activity) getContext()).finish();

            return super.dispatchKeyEvent(event);
        }
    });
Run Code Online (Sandbox Code Playgroud)

无需创建新类.


小智 8

以前的解决方案不再适用于 Android Pie +,您必须改为:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        mediaController.addOnUnhandledKeyEventListener((v, event) -> {
            //Handle BACK button
            if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP)
            {
                mediaController.hide(); //Hide mediaController,according to your needs, you can also called here onBackPressed() or finish() 
            }
            return true;
        });
    }
Run Code Online (Sandbox Code Playgroud)

  • 现在不仅公认的解决方案不起作用,Android甚至拒绝在返回时隐藏媒体控制器,这意味着当媒体控制器显示时,无论您点击后退按钮多少次,都不会发生任何事情。 (2认同)

Gre*_*g T 6

您还可以让Activity处理事件:

mVideoView.setMediaController(new MediaController(this){
    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK ) {
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                return true;
            } else if (event.getAction() == KeyEvent.ACTION_UP) {
                ((Activity) getContext()).onBackPressed();
                return true;
            }
        }
        return super.dispatchKeyEvent(event);
    }       
});
Run Code Online (Sandbox Code Playgroud)

然后在您的Activity中处理它:

@Override
public void onBackPressed() {
    // clean up or send result here
    finish();
}
Run Code Online (Sandbox Code Playgroud)