使用SYSTEM_UI_FLAG_HIDE_NAVIGATION时首先侦听TouchEvent

时间:2012-08-01 15:16:15

标签: android navigationbar touch-event

从API 14开始,您可以在Activity中的View上使用此标志SYSTEM_UI_FLAG_HIDE_NAVIGATION,告诉系统您要隐藏导航栏,直到有用户交互(屏幕触摸)。一旦用户点击屏幕,就会显示该栏。

我正在执行此操作的活动在用户触摸屏幕时执行一些操作(启动单独的活动),然后将上述标记添加到我的视图中,这非常有效。

添加该标志后,系统会拦截第一个屏幕触摸,并通过显示导航栏对其做出反应。直到第二次触摸,我的任何观点或我的活动才会收到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;
}

注意:我没有试图阻止第一次触摸时显示导航栏,我只是想在事件发生时采取其他一些行动。

1 个答案:

答案 0 :(得分:7)

正如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可以是对您的Activity中当前显示的任何视图的引用。就我而言,它是一个全屏VideoView,是我布局中唯一的视图。