使用 SYSTEM_UI_FLAG_HIDE_NAVIGATION 时监听第一个 TouchEvent
Posted
技术标签:
【中文标题】使用 SYSTEM_UI_FLAG_HIDE_NAVIGATION 时监听第一个 TouchEvent【英文标题】:Listen for first TouchEvent when using SYSTEM_UI_FLAG_HIDE_NAVIGATION 【发布时间】:2012-07-30 12:42:48 【问题描述】:从 API 14 开始,您可以在 Activity 中的视图上使用此标志 SYSTEM_UI_FLAG_HIDE_NAVIGATION
来告诉系统您要隐藏导航栏,直到有用户交互(屏幕触摸)。一旦用户点击屏幕,就会显示该栏。
当用户触摸屏幕时,我正在执行此操作的 Activity 会执行一些操作(启动单独的 Activity),然后将上述标志添加到我的视图中,这非常有效。
添加该标志后,系统会拦截第一次屏幕触摸并通过显示导航栏对其做出反应。直到第二次触摸,我的任何 View 或我的 Activity 才收到 TouchEvents。
有谁知道我可以设置一个侦听器的方法,让我在第一次触摸屏幕时启动我的第二个活动,而不是在使用此隐藏导航标志时需要双击?
我已经尝试了以下所有方法,但当第一次触摸屏幕以显示导航栏时,我没有收到任何回调。
@Override
public void onUserInteraction()
Log.i(myTag, "INTERACT");
@Override
public boolean onGenericMotionEvent(MotionEvent me)
Log.i(myTag, "GENERIC");
return true;
//I thought maybe the size change would lead to a callback here. No dice though.
@Override
public void onWindowAttributesChanged(WindowManager.LayoutParams params)
Log.i(myTag, "WINDOW CHANGE");
@Override
public boolean dispatchTouchEvent(MotionEvent me)
Log.i(myTag, "TOUCH");
return true;
注意:我并不是要阻止在第一次触摸时显示导航栏,我只是想在该事件发生时还采取一些其他措施。
【问题讨论】:
你试过View.OnSystemUiVisibilityChangeListener
吗?
@JoshLee 我没有,这确实有效!非常感谢。如果您愿意,请将其发布为答案,以便我接受。
【参考方案1】:
正如 Josh Lee 在他的评论中所建议的,View.OnSystemUiVisibilityChangeListener 是关键。
这是我使用的代码:
mView.setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener()
@Override
public void onSystemUiVisibilityChange(int vis)
Log.i(myTag, "System UI"+ vis);
if(vis == 0)
Intent i = new Intent(MainActivity.this, AnotherActivity.class);
startActivity(i);
finish();
);
我认为mView
可能是对当前在您的活动中显示的任何视图的引用。在我的例子中,它是一个全屏 VideoView,并且是我布局中的唯一视图。
【讨论】:
以上是关于使用 SYSTEM_UI_FLAG_HIDE_NAVIGATION 时监听第一个 TouchEvent的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)