背景
为用户提供一个接口,用户应用可以通过该接口,动态实现导航栏的显示与隐藏。
实现
监听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;
}
}
}
}