1

我在这上面拉我的头发。我想要做的是系统 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);
    }
}
4

0 回答 0