2

我一直在到处寻找,但我对此一无所知:试图在项目中激活沉浸式模式;几乎一切正常,除了我的状态栏的背景总是留在那里,破坏了沉浸感......我已经包含了激活沉浸模式之前和之后的屏幕截图,并将“colorPrimaryDark”设置为全绿色以获得最大对比度: 屏幕截图显示了状态栏的背景,什么都没有 我在空白项目中使用并重新插入以隔离此问题的代码直接来自谷歌开发示例,在我的 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: 到目前为止,我的理解是,关于我的内容(包括操作栏)的位置/大小,我只有 2 个选择:
屏幕顶部,它将显示被状态栏部分隐藏的操作栏,
或者在状态栏的下方底部,当状态栏被隐藏时,这会给我留下一个“洞”-_-
我现在正在寻找一种解决方案,在我的onSystemUiVisibilityChangeListener方法中自己在屏幕外/屏幕上设置 ActionBar 的动画,但找不到方法为了抓住它的观点,在那里发布的解决方案https://stackoverflow.com/a/21125631/6463888似乎已经过时了......

4

3 回答 3

1

所以,我解决这个问题的方式可能看起来有点牵强,但我只是一个初学者,所以请随时发表评论!我不再使用getSupportActionBar().show();getSupportActionBar().hide();不再使用,但我设法抓住了包含作为 AppBarLayout 的 ActionBar 的视图,并且我为这个视图设置了动画。所以我调用了一个小函数animateActionBarInOrOut来在屏幕内或屏幕外对其进行动画处理onSystemUiVisibilityChange

    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
      }
    }

虽然这并不完全是对最初问题的回答,但它可以作为问题的解决方案,只需相应地移动内容......

于 2016-06-14T13:43:36.010 回答
1

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

  1. 隐藏:进入全屏

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

  2. 显示:正常显示

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

于 2017-09-28T07:29:04.247 回答
0

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

于 2016-06-14T10:47:01.237 回答