Android:检测导航栏可见性

Android:检测导航栏可见性,android,Android,如何检测导航栏的存在并将其隐藏 在我的onCreate()中,我调用hideNavigationBar()方法来隐藏导航栏,然后我注册一个侦听器,每当用户触摸屏幕上的任何位置时,它就会隐藏导航栏,正如。当触摸事件后导航栏变为可见时,侦听器会再次调用hideNavigationBar()方法,但该方法无效,导航栏仍然可见 这是我的onCreated()方法: @Override protected void onCreate(Bundle savedInstanceState) {

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

在我的
onCreate()
中,我调用
hideNavigationBar()
方法来隐藏导航栏,然后我注册一个侦听器,每当用户触摸屏幕上的任何位置时,它就会隐藏导航栏,正如。当触摸事件后导航栏变为可见时,侦听器会再次调用
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();
                        }
                    }
                });
    }
 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);
    }
这是我的
hideNavigationBar()
方法:

@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();
                        }
                    }
                });
    }
 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);
    }
如何在每次导航栏可见时隐藏它

谢谢

请执行以下操作:

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
}

原始答案

尝试使用调用
Runnable
中的
hideNavigationBar()
。例如:

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

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


通常,保持UI与系统栏可见性的更改保持同步是一种很好的做法。例如,您可以使用此侦听器隐藏和显示操作栏,同时显示状态栏隐藏和显示。

操作栏或导航栏?@AsifMujteba导航栏可能与检查此项的重复项以获得工作解决方案:这将返回设备是否具有软导航栏。这对我来说非常有用。让我们检测导航栏可见性的更改。不幸的是,它没有报告酒吧的初始状态。我已经做了一项工作,在这里我设置了一个新的systemUiVisibility状态,然后立即将其恢复,使这个侦听器启动。似乎现在正在做这项工作!每次导航栏隐藏或可见时,我都会得到条件的真实值。我正在使用Android导航手势功能隐藏和显示导航栏。。有什么解决办法吗?@Nik我在帖子上看到了你关于导航栏高度的评论。你找到解决办法了吗?我无法正确获得导航条的尺寸。@狙击手:不,我无法找到解决方案。