我知道如何控制返回按钮。我把一个VideoView
嵌入到FrameLayout
中。我的问题是,当视频弹出时,视频控件会显示几秒钟。在它们可见的时候按下返回按钮会隐藏视频控件。是否有一种方法忽略该功能,并执行下一个返回操作,就像视频控件没有显示一样?
我问这个问题的原因是,如果我真的想要返回,我必须按两次返回按钮;一次隐藏控件,一次实际返回。
我知道如何控制返回按钮。我把一个VideoView
嵌入到FrameLayout
中。我的问题是,当视频弹出时,视频控件会显示几秒钟。在它们可见的时候按下返回按钮会隐藏视频控件。是否有一种方法忽略该功能,并执行下一个返回操作,就像视频控件没有显示一样?
我问这个问题的原因是,如果我真的想要返回,我必须按两次返回按钮;一次隐藏控件,一次实际返回。
根据源代码,这应该可以实现:
MediaController
(在此答案中称之为RonnieMediaController
)RonnieMediaController
中的dispatchKeyEvent()
KeyEvent.KEYCODE_BACK
,如果是,告诉您的活动finish()
VideoView
中使用RonnieMediaController
而不是MediaController
个人认为最好保持原样,因为这样更改后,您的用户将无法随时让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;
});
}
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();
}
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);
}
}
getContext()
的方式,但它并没有起作用。Context c = getContext(); c.finish();
它说finish()对于Context未定义
。 - Ronnie