我一直在寻找各处,但我对此感到茫然:试图激活项目的沉浸式模式; 几乎一切都运行正常,除了我的状态栏的背景总是停留在那里,破坏沉浸... 我在激活沉浸式模式之前和之后都包含了屏幕截图,并将“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似乎已经过时了......
答案 0 :(得分:1)
所以,
我解决这个问题的方式可能看起来有点紧张,但我只是一个初学者,所以请随意发表评论!
我不再使用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
}
}
虽然这不是最初问题的答案,但它可以解决问题,只需相应地移动内容......
答案 1 :(得分:1)
我今天遇到了同样的问题。但我没有通过setSystemUiVisibility
解决这个问题。我使用以下方法解决它:
隐藏:进入全屏
mActivity.getWindow()。setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
显示:正常显示
。mActivity.getWindow()clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
答案 2 :(得分:0)
您的问题是由StatusBar性质引起的,它与您的主要内容有一个单独的布局,您需要手动设置其颜色。例如,当您调用onSystemUiVisibilityChange()时,您可以使用背景颜色,并在使用该颜色设置StatusBar的颜色之后。这是避免2种不同背景颜色的解决方法。