我一直在寻找各地,但我对此感到茫然:试图激活项目的沉浸式模式;几乎一切都运行正常,除了状态栏的背景总是停留在那里,破坏了沉浸感......我在激活沉浸式模式之前和之后都包含了屏幕截图,并将“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似乎已经过时了.. 。
我今天遇到了同样的问题。但我没有通过setSystemUiVisibility
解决这个问题。我用以下方法解决它:
所以,我解决这个问题的方式可能看起来有点紧张,但我只是一个初学者,所以随时评论!我不再使用getSupportActionBar().show();
或getSupportActionBar().hide();
,但我设法抓住包含ActionBar的View,这是一个AppBarLayout,我改为动画这个View。所以我调用一个小函数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
}
}
虽然这不是最初问题的答案,但它可以解决问题,只需相应地移动内容......
您好你的问题是由StatusBar性质引起的,它与你的主要内容有一个单独的布局,你需要手动设置他的颜色。例如,当您调用onSystemUiVisibilityChange()时,您可以使用背景颜色,并在使用该颜色设置StatusBar的颜色之后。这是避免2种不同背景颜色的解决方法。