我知道如何控制后退按钮。我有一个VideoView
嵌入在FrameLayout
. 我的问题是当视频弹出时,视频控件会出现几秒钟。在它们可见时点击后退按钮会隐藏视频控件。有没有办法忽略该功能并执行下一个后退操作,就好像视频控件不可见一样?
我问的原因是如果我真的想返回,我必须按两次返回按钮;一次隐藏控件,第二次实际返回
我知道如何控制后退按钮。我有一个VideoView
嵌入在FrameLayout
. 我的问题是当视频弹出时,视频控件会出现几秒钟。在它们可见时点击后退按钮会隐藏视频控件。有没有办法忽略该功能并执行下一个后退操作,就好像视频控件不可见一样?
我问的原因是如果我真的想返回,我必须按两次返回按钮;一次隐藏控件,第二次实际返回
根据源代码,这应该可以工作:
MediaController
(为了这个答案的目的,称之为RonnieMediaController
)dispatchKeyEvent()
_RonnieMediaController
KeyEvent.KEYCODE_BACK
,如果遇到,告诉你的活动finish()
RonnieMediaController
而不是MediaController
与您的VideoView
就个人而言,我只是不理会它,因为通过这种更改,您的用户无法RonnieMediaController
按需消失。
你可以简单地写:
mVideoView.setMediaController(new MediaController(this){
public boolean dispatchKeyEvent(KeyEvent event)
{
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK)
((Activity) getContext()).finish();
return super.dispatchKeyEvent(event);
}
});
无需创建新类。
以前的解决方案不再适用于 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;
});
}
您还可以让 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();
}
在 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);
}
}