【问题标题】:Android: detect navigation bar visibilityAndroid:检测导航栏可见性
【发布时间】:2015-04-21 14:50:58
【问题描述】:

如何检测导航栏的存在并将其隐藏?

在我的onCreate() 中,我调用hideNavigationBar() 方法来隐藏导航栏,然后我注册一个侦听器以在每次用户触摸屏幕上的任何位置时隐藏导航栏,如documentations 报告的那样.当导航栏在触摸事件后变为可见时,侦听器再次调用hideNavigationBar() 方法,但没有效果,导航栏仍然可见。

这是我的onCreated() 方法:

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

        hideNavigationBar();

        View decorView = getWindow().getDecorView();
        decorView.setOnSystemUiVisibilityChangeListener
                (new View.OnSystemUiVisibilityChangeListener() {
                    @Override
                    public void onSystemUiVisibilityChange(int visibility) {
                        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                            Toast.makeText(getApplicationContext(), "Visible", Toast.LENGTH_SHORT).show();
                            hideNavigationBar();
                        } else {
                            Toast.makeText(getApplicationContext(), "Not visible", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
    }

这是我的hideNavigationBar() 方法:

 private void hideNavigationBar() {

        Toast.makeText(getApplicationContext(), "hideNavigationBar()", Toast.LENGTH_SHORT).show();

        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
    }

如何在每次可见时隐藏导航栏?

谢谢

【问题讨论】:

标签: android


【解决方案1】:

您可以将此代码添加到活动的 onCreate() 方法中:

      View decorView = getWindow().getDecorView();
    decorView.setOnSystemUiVisibilityChangeListener
            (new View.OnSystemUiVisibilityChangeListener() {
                @Override
                public void onSystemUiVisibilityChange(int visibility) {
                    if ((visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {                
                        // TODO: The navigation bar is visible. Make any desired
                        // adjustments to your UI, such as showing the action bar or
                        // other navigational controls.
                        hideNavigationBar() 

                    } else {
                        // TODO: The navigation bar is NOT visible. Make any desired
                        // adjustments to your UI, such as hiding the action bar or
                        // other navigational controls.
                    }
                }
            });

让您的 UI 与系统栏可见性的变化保持同步通常是一种很好的做法。例如,您可以使用此侦听器来隐藏和显示操作栏,同时隐藏和显示状态栏。Android-Responding to UI Visibility Changes

【讨论】:

  • 这对我很有用。让我检测导航栏可见性的变化。不幸的是,它没有报告栏的初始状态。我有一个解决方法,我设置了一个新的 systemUiVisibility 状态,然后立即恢复它以使该侦听器触发。似乎现在正在做这项工作!
  • 每当导航栏隐藏或可见时,我都会获得真正的条件价值。我正在使用 Android 导航手势功能来隐藏和显示导航栏.. 有什么解决方案吗?
  • @Nik 我在有关导航栏高度的帖子上看到了您的 cmets。你找到任何解决方案了吗?我无法正确获取导航栏大小。
  • @Sniper 不,我无法找到解决方案。
【解决方案2】:

这样做:

boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();
boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);

if(!hasMenuKey && !hasBackKey) {
    // Do whatever you need to do, this device has a navigation bar
}

原答案Check for navigation bar

【讨论】:

  • 返回设备是否有软导航栏。
【解决方案3】:

尝试使用View.post(Runnable)Runnable 中调用hideNavigationBar()。例如:

...
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
    decorView.post(new Runnable() {
        @Override
        public void run() {
            hideNavigationBar();
        }
    });
}
...

【讨论】:

    猜你喜欢
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    相关资源
    最近更新 更多