Android后退按钮和MediaController

时间:2011-05-18 22:37:32

标签: android back-button back mediacontroller

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

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

4 个答案:

答案 0 :(得分:28)

根据源代码,这应该有效:

  1. 扩展MediaController(为了这个答案,请将其称为RonnieMediaController
  2. 覆盖dispatchKeyEvent()
  3. 中的RonnieMediaController
  4. 在链接到超类之前,请检查KeyEvent.KEYCODE_BACK,如果遇到这种情况,请将您的活动告诉finish()
  5. RonnieMediaController
  6. 上使用MediaController代替VideoView

    就个人而言,我只是不管它,因为这项更改使您的用户无法按需消失RonnieMediaController

答案 1 :(得分:17)

您可以简单地写一下:

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

            return super.dispatchKeyEvent(event);
        }
    });

无需创建新课程。

答案 2 :(得分:6)

以前的解决方案不再适用于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;
        });
    }

答案 3 :(得分:5)

您还可以让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);
    }       
});

然后在您的活动中处理它:

@Override
public void onBackPressed() {
    // clean up or send result here
    finish();
}