17

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

当用户触摸屏幕时,我正在执行此操作的 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;
}

注意:我并不是要阻止在第一次触摸时显示导航栏,我只是想在该事件发生时还采取一些其他措施。

4

1 回答 1

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可能是对当前在您的活动中显示的任何视图的引用。在我的情况下,它是一个全屏 VideoView,并且是我布局中的唯一视图。

于 2013-03-04T22:04:21.170 回答