android - 进入沉浸模式时状态栏背景留在屏幕上?

标签 android statusbar android-immersive

我一直在到处搜索,但我对此感到困惑:尝试在项目上激活沉浸式模式; 几乎一切都工作正常,除了我的状态栏的背景总是留在那里,破坏了沉浸感...... 我提供了激活沉浸模式之前和之后的屏幕截图,并将“colorPrimaryDark”设置为全绿色以获得最大对比度: screenshots showing the background of the status bar when nothing should be there 我使用并重新插入到一个空白项目中以隔离此问题的代码直接来自谷歌开发示例,在我的 MainActivity 中,我有:

private final String TAG = "DEBUG::" + this.getClass().getSimpleName();
private final int INITIAL_HIDE_DELAY = 1500;
private View decorView;
private Toolbar toolbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    //setting needed decorView for fullscreen behavior
    decorView = getWindow().getDecorView();
    decorView.setOnSystemUiVisibilityChangeListener(onSystemUiVisibilityChangeListener);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    Log.i(TAG, "onWindowFocusChanged::hasFocus = " + hasFocus);
    if (hasFocus) {// When the window gains focus, hide the system UI.
        delayedHide(INITIAL_HIDE_DELAY);
    } else {// When the window loses focus, cancel any pending hide action.
        mHideHandler.removeMessages(0);
    }
}

private void hideSystemUI() {
    Log.i(TAG, "hideSystemUI");
    int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
    uiOptions |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
    uiOptions |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
    uiOptions |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    uiOptions |= View.SYSTEM_UI_FLAG_FULLSCREEN;
    uiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
    uiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE;
    decorView.setSystemUiVisibility(uiOptions);
}
private final Handler mHideHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        hideSystemUI();
    }
};

private void delayedHide(int delayMillis) {
    Log.i(TAG, "delayedHide");
    mHideHandler.removeMessages(0);
    mHideHandler.sendEmptyMessageDelayed(0, delayMillis);
}

private View.OnSystemUiVisibilityChangeListener onSystemUiVisibilityChangeListener =
        new View.OnSystemUiVisibilityChangeListener() {
            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                    // The system bars are visible
                    getSupportActionBar().show();
                    delayedHide(INITIAL_HIDE_DELAY);
                } else {
                    // The system bars are NOT visible
                    getSupportActionBar().hide();
                }
            }
        };

我想知道我的问题是否可能来自布局或样式文件,但这些是来自项目生成的原始文件...... 我希望有人能指出我失败的地方! 提前致谢!

编辑:我发现从我的 Activity 布局文件中删除: android:fitsSystemWindows="true" 允许真正的全屏模式,但是,我的 ActionBar 在显示时部分隐藏在 StatusBar 后面。难道是当我在 onSystemUiVisibilityChangeListener 中设置 getSupportActionBar().show(); 时,它绘制得太快了?

编辑 2:到目前为止,我的理解是,关于内容的位置/大小(包括操作栏),我只有 2 个选择:
屏幕顶部,这将显示被状态栏部分隐藏的操作栏,
或者在状态栏底部下方,当状态栏隐藏时,这会给我留下一个“洞”-_-
我现在正在寻找一种解决方案,可以在我的 onSystemUiVisibilityChangeListener 方法中自己对 ActionBar 进行屏幕外/屏幕上的动画处理,但无法找到一种方法来获取其 View 来执行此操作,解决方案发布在那里https://stackoverflow.com/a/21125631/6463888似乎已经过时了...

最佳答案

我今天也遇到了同样的问题。但我没有通过setSystemUiVisibility解决这个问题。我用以下方法解决了这个问题:

  1. 隐藏:进入全屏

    mActivity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

  2. 显示:正常显示

    mActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

关于android - 进入沉浸模式时状态栏背景留在屏幕上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37809637/

相关文章:

android - 尝试持久存储 android.graphics.Path 值

android - 添加一个开关到溢出菜单?

java - Android videoview - 身临其境 - 重叠 Controller

android - 沉浸模式下edittext聚焦时如何隐藏导航栏

java - "removedialog"同时显示2个对话框时的问题

ios - 在 iPhone X 上,分别控制显示/隐藏导航栏和状态栏

android - Lollipop 状态栏上的工具栏阴影

Vim - 在状态行中显示事件的拼写检查语言

android - 如何在方向改变时保持沉浸式模式?

android - 安卓手机的唯一名称