Android 返回按钮和媒体控制器

31

我知道如何控制返回按钮。我把一个VideoView嵌入到FrameLayout中。我的问题是,当视频弹出时,视频控件会显示几秒钟。在它们可见的时候按下返回按钮会隐藏视频控件。是否有一种方法忽略该功能,并执行下一个返回操作,就像视频控件没有显示一样?

我问这个问题的原因是,如果我真的想要返回,我必须按两次返回按钮;一次隐藏控件,一次实际返回。

5个回答

34

根据源代码,这应该可以实现:

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

个人认为最好保持原样,因为这样更改后,您的用户将无法随时让RonnieMediaController消失。


这就是我认为你会使用getContext()的方式,但它并没有起作用。Context c = getContext(); c.finish(); 它说finish()对于Context未定义 - Ronnie
@Ronnie:您需要将“Context”强制转换为“Activity”。 - CommonsWare
明白了!谢谢,它起作用了。你是对的,我不太喜欢它现在的功能方式。像你说的那样,最初的方式更好。再次感谢。 - Ronnie
@CommonsWare:我在使用MediaController时遇到了类似的问题。你可以看一下吗? http://stackoverflow.com/questions/22269880/why-mediacontroller-prevents-my-onkeyup-commands-to-run - Behnam
@CommonsWare:我按照您提到的方法尝试了一下。但是对我来说,只有在我播放视频约3秒钟后,返回按钮才能正常工作。而且在设置视频之前,返回按钮就可以使用。如果我没有播放视频,返回按钮将无法工作。 - Anooj Krishnan G
显示剩余5条评论

18
您可以简单地编写:

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

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

无需创建新的类。


1
如果在返回按钮按下时事件被调用两次,你可以在第一个 if 条件里添加这个过滤器:if (event.getAction() == KeyEvent.ACTION_UP){..} - Jasper
如果您已经在扩展某个东西,那么这是最好的解决方案,因为您只能进行一个扩展。 - Riot Goes Woof

15

先前的解决方案在 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;
        });
    }

2
不仅现在被接受的解决方案不起作用了,而且当你切换回来时,Android甚至拒绝隐藏媒体控制器,这意味着当媒体控制器正在显示时,无论你按多少次返回按钮都没有任何反应。 - Antony Ng

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);
    }       
});

然后在您的Activity中处理它:

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

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);
        }
    }

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