Cómo controlar la visualización y ocultación de la barra de navegación en el sistema Android
En el código fuente de Android, esta área se llama NavigationBar. Al mismo tiempo, Google ha reservado banderas en el código para controlar su visualización y ocultación. El control de visualización y ocultación de NavigationBar se encuentra en SystemU. La ruta específica es: \frameworks\base\packages base\packages\SystemUI: en el proyecto de SystemUI, hay una clase PhoneStatusBar.java, donde puede encontrar el código relevante. para controlar NavigationBar. Código:
En el método start(), puede ver que NavigationBar se agregó en ese momento, pero solo después de agregarlo puede determinar si se muestra u oculta detrás del control.
lt;span style="font-size:18px;"gt;@Override
public void start() {
mDisplay = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
updateDisplaySize();
// M: Compatible con la función Smartbook.
if (SIMHelper.isMediatekSmartBookSupport()) {
// M: [ALPS01097705] Consulta el estado del complemento lo antes posible. mIsDisplayDevice = SIMHelper.isSmartBookPluggedIn(mContext);
Log.v(TAG, "start, mIsDisplayDevice=" mIsDisplayDevice);
}
super.start( ); // Llama a createAndAddWindows()
addNavigationBar();
// Finalmente, llama a la política de íconos para instalar/actualizar todos los íconos.
getUriFor(SETTING_HEADS_UP), verdadero,
mHeadsUpObserver
}
}lt;/spangt;
En este ejemplo addNavigationBar( ) se implementa de la siguiente manera:
lt;span style="font-size: 18px;"gt; // Adecuado para dispositivos de pantalla pequeña (léase: teléfonos móviles) que carecen de botones de navegación de hardware
private void addNavigationBar() {
if (DEBUG) Slog.v(TAG, "addNavigationBar: a punto de agregar " mNavigationBarView
if (mNavigationBarView == null); return;
prepareNavigationBarView();
mWindowManager Antes de llamar al método addNavigationBar(), volverá a llamar al método principal super.start() de start() para determinar si debe hacerlo. agregar barra de navegación. start(), llamará a createAndAddWindows() para determinar si agregar la barra de navegación y luego decidirá si crear una instancia de la vista de la barra de navegación.
lt;span style="font-size:18px;"gt;try {
boolean showNav = mWindowManagerService.hasNavigationBar();
if (DEBUG ) Slog.v(TAG, "hasNavigationBar=" showNav);
if ( showNav) {
mNavigationBarView =
(NavigationBarView) View.inflate(contexto , R.layoutView);
(NavigationBarView) View.inflate(contexto, R.layoutView);
(NavigationBarView) View.inflate(contexto, R.layoutView); p>
(NavigationBarView) View.inflate(contexto, R.layoutView);
p>
(NavigationBarView) View.inflate(R.layoutView)inflate(contexto, R.layout. Navigation_bar, null);
mNavigationBarView.setDisabledFlags(mDisabled);
mNavigationBarView.setBar(this);
}
}
}
} catch (RemoteException ex) {
// ¿No hay administrador de ventanas? Buena suerte
}lt;/spangt;
La clase WindowManagerService implementa la interfaz WindowManagerPolicy, por lo que WindowManagerService volverá a llamar a la interfaz hasNavigationBar() de WindowManagerPolicy,
lt ;span style="font-size:18px;"gt; @Override
public boolean hasNavigationBar() {
return mPolicy.hasNavigationBar();
}lt;/spangt;
La llamada descendente de política en realidad llama a la implementación del método hasNavigationBar en PhoneWindowManager. El siguiente código es el método hasNavigationBar() en PhoneWindowManager.
lt; span style="font-size:18px;"> // Utilice este método en lugar de verificar config_showNavigationBar para que siempre esté
habilitado por qemu.hw en el emulador. . teclas principales reescritas.
public boolean hasNavigationBar() {
return mHasNavigationBar;
}lt;/spangt
Se puede realizar la asignación de mHasNavigationBar; en PhoneWindowManager Encontrado en el método setInitialDisplaySize(Display display, int width, int height, int densidad),
lt span style="font-size: 18px;"gt; /p>
lt; p>
mHasNavigationBar = mContext.getResources().getBoolean(
También tieneNavigationBar().
String navBarOverride = SystemProperties.get(" qemu.hw.mainkeys");
if (! "".equals(navBarOverride)) {
if (navBarOverride.equals("1")) mHasNavigationBar = false;
else if (navBarOverride.equals("0")) mHasNavigationBar = true;
}
} else {
mHasNavigationBar = false ;
}lt;/spangt;
En el código anterior, puede ver que el valor de mHasNavigationBar de mHasNavigationBar se establece en dos lugares:
1. el valor de config_showNavigationBar se toma del archivo de recursos del sistema, la ruta del archivo para establecer este valor es frameworks/base/core/res/values/config.xml
lt;!-- Si se muestra el software barra de navegación Nota: Esto puede cambiarse desde la configuración en el futuro. Detectado automáticamente. --gt;
lt;bool name="config_showNavigationBar"gt;falselt;/boolgt;
2. Luego, el sistema debe obtener el valor "qemu.hw.mainkeys", que puede sobrescribir el valor de mHasNavigationBar obtenido anteriormente. Si el valor de "qemu.hw.mainkeys" es 2, el sistema debe obtener el valor de "qemu.hw.mainkeys", que puede anular el valor de mHasNavigationBar anterior. Si el valor obtenido a través de "qemu.hw.mainkeys" no es nulo, entonces si el valor es verdadero o falso se establecerá de acuerdo con las siguientes condiciones.
Por lo tanto, las dos configuraciones anteriores **** también determinan la visualización y ocultación de la barra de navegación.