6

使用沉浸式模式时遇到问题。这是我在所有活动中添加的代码:

 @Override
 public void onWindowFocusChanged(boolean hasFocus) {
     super.onWindowFocusChanged(hasFocus);
     if (hasFocus) {
         getWindow().getDecorView().setSystemUiVisibility(
             View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                 | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                 | View.SYSTEM_UI_FLAG_FULLSCREEN
                 | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
         );
     }
 }

navigationBar和_statusBar,这很好。

问题是每次我去另一个活动时,navigationBar出现,然后消失。我希望navigationBar不要像那样出现。

4

5 回答 5

6

最简单的工作方式是创建一个基本活动类,如下所示:

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        enableImmersiveMode();
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);

        if(hasFocus) {
            enableImmersiveMode();
        }
    }

    protected void enableImmersiveMode() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            );
        }
    }
}

并且所有应该在沉浸式模式下工作的活动都应该从上面的基类继承。

我刚刚测试过了。它可以防止屏幕菜单在更改活动时隐藏和显示。

于 2016-07-05T09:35:52.737 回答
3

如果您在活动的 onCreate 方法中调用此短代码,如下例所示:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            hideSystemUI();
            ...
   }

 // This snippet hides the system bars.
    private void hideSystemUI() {
        // Set the IMMERSIVE flag.
        // Set the content to appear under the system bars so that the content
        // doesn't resize when the system bars hide and show.
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
                        | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
                        | View.SYSTEM_UI_FLAG_IMMERSIVE);
    }

而且您也必须调用onWindowFocusChanged上的方法。

我希望这对你有帮助 =)

于 2015-03-25T18:17:16.550 回答
3

也许已经晚了,但现在我遇到了和你一样的问题,偶然发现了这篇文章。出于好奇,我找到了对我有用的解决方案。我手动调用了函数“onWindowFocusChanged”并传递了“true”参数。我在“setContentView(R.layout.activity_main);”之前在 OnCreate 中调用了该函数。在添加布局之前执行了该功能并设置了沉浸式模式(全屏),现在我看不到导航和状态栏的隐藏动画。我希望我对你有所帮助。

这是代码:

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

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);}
}
于 2017-01-06T20:58:35.287 回答
2

我也遇到过这个问题。配置更改后,似乎无法阻止 Android 再次显示导航栏。

更糟糕的是,系统UI何时恢复也无法保证。根据我在某些设备上的测试,导航栏甚至可以在被调用之后重新onWindowFocusChanged出现onResume

我发现防止不需要的 UI 重新出现的唯一可靠方法是添加isInFullScreenMode布尔标志并实现View.OnSystemUiVisibilityChangeListener如下所示:

@Override
public void onSystemBarsVisible() {
    if (isInFullScreenMode) {
        // If Android presented system bars 
        // but our app doesn't need them at this point 
        // just call hideSystemUi() again
        hideSystemUi();
        return;
    }
}

@Override
public void onSystemBarsHidden() {
    if (!isInFullScreenMode) {
        // Similar technique as shown above
        showSystemUi();
        return;
    }
}

当然,有时在旋转时,我们可以看到系统栏是如何快速出现和消失的。但至少我们可以确定我们的应用程序的 UI 状态将被可靠地恢复。

编辑:为了防止可能的混淆(如评论中所见),我将澄清几件事:

  • onSystemBarsVisible并且onSystemBarsHidden是在我的应用程序中定义的自定义方法。你不会在 Android 框架中找到它们;
  • 此处使用override关键字是因为这些方法是合同(接口)的一部分;
  • 我使用此功能的应用程序现在已过时。但是,我仍然记得基本思想如下(Kotlin 中的片段):
fun onSystemUiVisibilityChange(visibility: Int) {
    if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) {
        // The system bars are visible
        onSystemBarsVisible()
    } else {
        // The system bars are NOT visible.
        onSystemBarsHidden()
    }
}
于 2017-03-14T18:46:14.393 回答
0

setSystemUiVisibility真正的解决方案是同时调用onResumeonWindowFocusChanged

@Override
protected void onResume() {
    super.onResume();
    hide();
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    hide();
}

public void hide() {
    getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
            View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
            View.SYSTEM_UI_FLAG_FULLSCREEN |
            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
            View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE);           
}
于 2016-08-10T17:36:25.777 回答