Red de conocimiento informático - Material del sitio web - Cómo controlar la visualización y ocultación de la barra de navegación en el sistema Android

Cómo controlar la visualización y ocultación de la barra de navegación en el sistema Android

Las teclas de inicio, atrás y menú en la mayoría de los teléfonos Android que utilizamos son teclas físicas sensibles al tacto. Si estás usando Nexus 4 o Nexus 5 de Google, notarás que no tienen botones físicos o sensibles al tacto, sino que tienen una pequeña barra negra en la parte inferior de la pantalla con controles de 3 botones, lo que definitivamente hace El diseño del teléfono parece más minimalista. Pero me he encontrado con algunas personas con teléfonos Nexus 4 quejándose de este diseño, y la razón es simple: la pantalla buena muestra 3 botones (como se muestra a continuación): Atrás, Inicio y Recientes, y estos botones siempre están ahí. , ocupando espacio.

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.