31

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

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

4

5 回答 5

33

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

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

就个人而言,我只是不理会它,因为通过这种更改,您的用户无法RonnieMediaController按需消失。

于 2011-05-18T23:29:21.433 回答
17

你可以简单地写:

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

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

无需创建新类。

于 2013-01-10T13:11:05.550 回答
9

以前的解决方案不再适用于 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;
        });
    }
于 2020-04-21T08:04:52.290 回答
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);
    }       
});

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

@Override
public void onBackPressed() {
    // clean up or send result here
    finish();
}
于 2016-01-27T18:08:41.253 回答
0

在 Xamarin.Android 中,您可以像这样处理这个问题

public class CustomMediaController : MediaController
    {
        private FragmentActivity act;
        public CustomMediaController(Context context, FragmentActivity myActivity) : base(context)
        {
            act = myActivity;
        }
        public override bool DispatchKeyEvent(KeyEvent e)
        {
            if(e.KeyCode == Keycode.Back)
            {
                act.OnBackPressed();
            }
            return base.DispatchKeyEvent(e);
        }
    }
于 2022-02-11T07:46:47.053 回答