【问题标题】:Android. Hiding navigation bar sometimes fails安卓。隐藏导航栏有时会失败
【发布时间】:2016-12-30 05:51:44
【问题描述】:

下面的代码旨在在用户每次点击屏幕时切换导航栏的可见性。除了一种情况外,它工作正常 - 非常快速地点击屏幕。在某些情况下,当用户点击非常快时,尽管触发了onClick 事件,导航栏仍会留在屏幕上。

这里是MainActivity的代码:

package com.example.ui_test;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {

private final String DEBUG_TAG = "UI TEST";
int uiOptions = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RelativeLayout r = (RelativeLayout) findViewById(R.id.main_layout);
    r.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            toggleUiVisibility();
        }
    });

    View decorView = getWindow().getDecorView();
    decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int visibility) {
            Log.d(DEBUG_TAG, "Visibility changed. New flags: " + Integer.toString(visibility, 2));
            uiOptions = visibility;
        }
    });
}

protected void toggleUiVisibility() {
    uiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;        
    getWindow().getDecorView().setSystemUiVisibility(uiOptions);
    Log.d(DEBUG_TAG, "Set visibility to: " + Integer.toString(uiOptions, 2));
};

}

我尝试了不同的布局(无视图、TextView、全屏 ImageView),行为没有区别。这是 LogCat 的输出,看第 6 行。在setSystemUiVisibility() 调用之后没有记录onSystemUiVisibilityChange 事件:

09-21 18:24:19.871: D/UI TEST(3901): Visibility changed. New flags: 0
09-21 18:24:21.139: D/UI TEST(3901): Set visibility to: 10
09-21 18:24:21.171: D/UI TEST(3901): Visibility changed. New flags: 10
09-21 18:24:23.478: D/UI TEST(3901): Visibility changed. New flags: 0
09-21 18:24:24.321: D/UI TEST(3901): Set visibility to: 10
09-21 18:24:25.245: D/UI TEST(3901): Set visibility to: 0
09-21 18:24:25.927: D/UI TEST(3901): Set visibility to: 10
09-21 18:24:25.959: D/UI TEST(3901): Visibility changed. New flags: 10
09-21 18:24:33.625: D/UI TEST(3901): Visibility changed. New flags: 0
09-21 18:24:35.458: D/UI TEST(3901): Set visibility to: 10
09-21 18:24:35.490: D/UI TEST(3901): Visibility changed. New flags: 10
09-21 18:24:36.607: D/UI TEST(3901): Visibility changed. New flags: 0
09-21 18:24:38.294: D/UI TEST(3901): Set visibility to: 10
09-21 18:24:38.326: D/UI TEST(3901): Visibility changed. New flags: 10

我使用的是 Android 5.1.1 设备和 22 个目标/最低 API 级别。

【问题讨论】:

    标签: android navigationbar android-fullscreen


    【解决方案1】:

    好的,事实证明这是一项功能,而不是错误。问题在于setSystemUiVisibility 连续呼叫之间的间隔不是快速点击屏幕。我不得不深入研究 Android 资源,然后发现:

    ...
    
    // We don't allow the system's nav bar to be hidden
    // again for 1 second, to prevent applications from
    // spamming us and keeping it from being shown.
     newVal = mForceClearedSystemUiFlags |
              View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
     if (mForceClearedSystemUiFlags != newVal) {
         mForceClearedSystemUiFlags = newVal;
         changed = true;
         mHandler.postDelayed(mClearHideNavigationFlag, 1000);
     }
    
    ...
    

    HideNavInputEventReceiver 在PhoneWindowManager.java 中。我还在 Xperia Z2 上的相册应用程序中重现了这个“错误”。

    【讨论】:

    • 你应该得到一枚奖牌。
    • 谢谢,很有用。
    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多