我在这上面拉我的头发。我想要做的是系统 ui + 我的视图切换全屏(状态栏和导航栏隐藏 + 沉浸式粘性)
-- 默认情况下,我希望隐藏用户界面,即只显示内容。这似乎是一个荒谬的问题
在第一次活动 onCreate 一切似乎都有效。在我旋转并再次调用 hide 之后,即使 mDecorView.getSystemUiVisibility() 和设置的参数标志不匹配,也不会调用 onSystemUiVisibilityChange ...。好像系统在某处缓存了最后一个值,然后因为它相同,不会触发侦听器..听起来很合理,对吗?所以我使用捆绑包中的最后一个可见性值手动调用syncChrome。现在 UI 在旋转后被隐藏或显示。但是,现在如果我切换它,系统栏会按原样返回,但不会调用侦听器!!!!如果我再切换一次,一切都会消失,如果我再切换一次,它会自行修复并工作(系统 ui 和我的 ui 都正确显示)......所以基本上在 3 次切换后它开始按预期工作-____-
一个想法是在旋转后不更改系统可见性,只需同步 chrome .. 不,如果我忽略设置 HIDE_FLAGS,则会显示系统栏.. 所以它不会像上面的情况那样记住最后的值......
我做错了什么还是这是一个错误?
(我不关心系统 ui 侦听器并手动显示/隐藏我的 ui,但是有一个小故障,当在 onCreate 中调用 hide() 时,然后我切换以显示系统 ui、导航栏和状态栏有奇怪的透明背景,即使它们应该有颜色 -如果我将它关闭然后再次打开,那么导航栏/状态栏颜色会按原样返回)
……用力敲我的头……
public class UiHider {
private static final String KEY_WAS_HIDDEN = "was_hidden";
private static final int INIT_FLAGS =
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
private static final int HIDE_FLAGS =
SYSTEM_UI_FLAG_HIDE_NAVIGATION // Hides nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // Hides status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; // Makes it not come back when touched
private View mDecorView;
private View[] mChromeViews;
public UiHider(Window window) {
mDecorView = Preconditions.checkNotNull(window.getDecorView());
}
public void prepareStableLayout() {
mDecorView.setSystemUiVisibility(INIT_FLAGS);
mDecorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override public void onSystemUiVisibilityChange(int visibility) {
syncChrome((visibility & SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0, false);
}
});
}
public void init(Bundle savedInstanceState, View... chromeViews) {
mToolbar = toolbar;
mChromeViews = chromeViews;
if (savedInstanceState == null) {
hideUi();
} else {
if (savedInstanceState.getBoolean(KEY_WAS_HIDDEN, false)) {
hideUi();
syncChrome(false, true);
} else {
showUi();
syncChrome(true, true);
}
}
}
public void toggle() {
if (isHidden()) {
showUi();
} else {
hideUi();
}
}
public void showUi() {
mDecorView.setSystemUiVisibility(mDecorView.getSystemUiVisibility() & ~HIDE_FLAGS);
}
public void hideUi() {
mDecorView.setSystemUiVisibility(mDecorView.getSystemUiVisibility() | HIDE_FLAGS);
}
private void syncChrome(boolean show, boolean immediate) {
// ... setVisibility VISIBLE or GONE to mChromeViews
}
private boolean isHidden() {
return (mDecorView.getSystemUiVisibility() & HIDE_FLAGS) == HIDE_FLAGS;
}
}
public class ReaderActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
onCreate(savedInstanceState);
setContentView(R.layout.foo);
mUiHider = new UiHider(getWindow());
mUiHider.prepareStableLayout();
mUiHider.init(savedInstanceState, mToolbar);
}
@Override public void onBodyClicked(int globalPageIndex) {
mUiHider.toggle();
}
@Override protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mUiHider.onSaveInstanceState(outState);
}
}