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

时间:2016-06-14 10:38:28

标签: android statusbar android-immersive

我一直在寻找各处,但我对此感到茫然:试图激活项目的沉浸式模式; 几乎一切都运行正常,除了我的状态栏的背景总是停留在那里,破坏沉浸... 我在激活沉浸式模式之前和之后都包含了屏幕截图,并将“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的底部,当状态栏被隐藏时会给我留下一个“洞”-_-
我现在正在寻找一种解决方案,在我的onSystemUiVisibilityChangeListener方法中自行动画屏幕上/屏幕上的ActionBar,但无法找到一种方法来抓住它的View,这样做的解决方案{{3似乎已经过时了......

3 个答案:

答案 0 :(得分: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
      }
    }

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

答案 1 :(得分:1)

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

  1. 隐藏:进入全屏

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

  2. 显示:正常显示

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

答案 2 :(得分:0)

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