进入沉浸式模式后,状态栏背景是否保持在屏幕上?

问题描述 投票:2回答:3

我一直在寻找各地,但我对此感到茫然:试图激活项目的沉浸式模式;几乎一切都运行正常,除了状态栏的背景总是停留在那里,破坏了沉浸感......我在激活沉浸式模式之前和之后都包含了屏幕截图,并将“colorPrimaryDark”设置为全绿色以获得最大对比度:screenshots showing the background of the status bar when nothing should be there我使用的代码和重新插入一个空白项目以隔离这个问题直接来自google开发示例,在我的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();
                }
            }
        };

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

编辑:我发现从我的活动的布局文件中删除:android:fitsSystemWindows="true"允许一个真正的全屏模式,但是,然后,我的ActionBar部分隐藏在StatusBar后面 - 显示时。可能是因为当我在getSupportActionBar().show();设置我的onSystemUiVisibilityChangeListener时,它会很快被绘制出来吗?

编辑2:到目前为止我对此的理解是,我对内容的位置/大小只有两个选择(包括操作栏): 屏幕顶部,将显示状态栏部分隐藏的actionBar, 或低于statusBar的底部,当statusBar被隐藏时,这将给我留下一个“洞”-_- 我现在正在寻找一个解决方案,在我的onSystemUiVisibilityChangeListener方法中自己在屏幕/屏幕上制作ActionBar动画,但无法找到一种方法来抓住它的视图这样做,解决方案张贴在那里https://stackoverflow.com/a/21125631/6463888似乎已经过时了.. 。

android statusbar android-immersive
3个回答
1
投票

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

  1. 隐藏:进入全屏 mActivity.getWindow()。setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
  2. 显示:正常显示 。mActivity.getWindow()clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

1
投票

所以,我解决这个问题的方式可能看起来有点紧张,但我只是一个初学者,所以随时评论!我不再使用getSupportActionBar().show();getSupportActionBar().hide();,但我设法抓住包含ActionBar的View,这是一个AppBarLayout,我改为动画这个View。所以我调用一个小函数animateActionBarInOrOutonSystemUiVisibilityChange内部或屏幕外面制作动画:

    private void animateActionBarInOrOut(boolean appears){
    Log.i(TAG, "animateActionBarInOrOut::actual position = " + toolbar.getY());
      if(appears){
       toolbar.animate().translationY(48).alpha(1); // move it out of the screen
      }else{
       toolbar.animate().translationY(-48).alpha(0); // move it out of the screen
      }
    }

虽然这不是最初问题的答案,但它可以解决问题,只需相应地移动内容......


0
投票

您好你的问题是由StatusBar性质引起的,它与你的主要内容有一个单独的布局,你需要手动设置他的颜色。例如,当您调用onSystemUiVisibilityChange()时,您可以使用背景颜色,并在使用该颜色设置StatusBar的颜色之后。这是避免2种不同背景颜色的解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.