Android 11 动态隐藏导航栏

948 阅读1分钟

背景

为用户提供一个接口,用户应用可以通过该接口,动态实现导航栏的显示与隐藏。

实现

监听Setting值的变化,动态增加与移除导航栏

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java

class NavigationBarController {
    // 代码1
    public void removeNavigationBars() {
        Display[] displays = mDisplayManager.getDisplays();
        for (Display display : displays) {
            removeNavigationBar(display.getDisplayId());
        }
    }
    private void removeNavigationBar(int displayId) {
        NavigationBarFragment navBar = mNavigationBars.get(displayId);
        if (navBar != null) {
            navBar.setAutoHideController(/* autoHideController */ null);
            View navigationWindow = navBar.getView().getRootView();
            WindowManagerGlobal.getInstance()
                    .removeView(navigationWindow, true /* immediate */);
            // Also remove FragmentHostState here in case that onViewDetachedFromWindow has not yet
            // invoked after display removal.
            FragmentHostManager.removeAndDestroy(navigationWindow);
            mNavigationBars.remove(displayId);
        }
    }
}

在代码1处增加 removeNavigationBars 方法,用于移除所有显示设备上的导航栏

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java

class StatusBar {
    private static final int NAV_BAR_SHOW = 0;
    private static final int NAV_BAR_HIDE = 1;
    private static final String NAV_BAR_DISABLE = "navbar_disabled";
    private RegisterStatusBarResult mRegisterStatusBarResult;//用于保存传入的状态栏信息
    ...
    protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) {
        ...
        //createNavigationBar(result);
        boolean showNav = Settings.Secure.getInt(mContext.getContentResolver(), NAV_BAR_DISABLE, 0) == 0;
        mContext.getContentResolver().registerContentObserver(Settings.Secure.getUriFor(NAV_BAR_DISABLE), false, new SettingsObserver(mHandler), UserHandle.USER_ALL);
        mRegisterStatusBarResult = result;
        if (showNav) createNavigationBar(mRegisterStatusBarResult);
        
        ...
    }  
    //用于监听setting,动态添加与移除状态栏
    private final class SettingsObserver extends ContentObserver {
        public SettingsObserver(Handler handler) {
            super(handler);
        }
        @Override
        public void onChange(boolean selfChange, Uri uri) {
            int navMode = Settings.Secure.getInt(mContext.getContentResolver(), NAV_BAR_DISABLE, 0);
            switch (navMode) {
                case NAV_BAR_HIDE:
                    mNavigationBarController.removeNavigationBars();
                    break;
                case NAV_BAR_SHOW:
                    createNavigationBar(mRegisterStatusBarResult);
                    break;
                default:
                    break;
            }
        }
    }
}