Red de conocimiento informático - Material del sitio web - Cómo personalizar la barra de navegación en Android

Cómo personalizar la barra de navegación en Android

En el código fuente de Android, esta área se llama NavigationBar. Al mismo tiempo, Google también ha reservado banderas en el código para controlar su visualización y ocultación: \frameworks/base/SystemUI. La ruta es\Para Android 4.0 o superior, SystemUi contiene dos partes: En el proyecto de SystemUI, hay una clase PhoneStatusBar.java, en esta clase puede encontrar el código relevante sobre el código de control de la barra de navegación:

En el método start(), puedes ver que la barra de navegación se agrega en ese momento, pero solo después de agregarla puedes decidir si mostrarla u ocultarla detrás del control.

@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), true,

mHeadsUpObserver);

}

}

En este ejemplo addNavigationBar() La implementación específica es la siguiente:

// Adecuado para dispositivos de pantalla pequeña que carecen de botones de navegación de hardware (léase: teléfonos móviles)

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 una 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.

pruebe {

boolean showNav = mWindowManagerService.hasNavigationBar();

if (DEBUG) Slog .v(TAG, "hasNavigationBar=" + showNav);

if ( showNav) {

mNavigationBarView =

(NavigationBarView) View.inflate(context, R.layoutView);

(NavigationBarView) View.inflate(contexto, R.layoutView);

(NavigationBarView) View.inflate(contexto, R.layoutView); >

(NavigationBarView) View.inflate(R.layoutView)inflate(context, R.layout.navigation_bar, null);

mNavigationBarView.setDisabledFlags(mDisabled);

mNavigationBarView .setBar(this);

}

}

}

} captura (RemoteException ex) {

// ¿Sin administrador de ventanas? Buena suerte

}

La clase WindowManagerService implementa la interfaz WindowManagerPolicy, por lo que WindowManagerService volverá a llamar a la interfaz hasNavigationBar() de WindowManagerPolicy,

< span style="font-size:18px;"> @Override

public boolean hasNavigationBar() {

return mPolicy.hasNavigationBar();

}< / span>

La llamada descendente de Política en realidad llama a la implementación del método hasNavigationBar de PhoneWindowManager. El siguiente código es el método hasNavigationBar() en PhoneWindowManager.

//Utilice este método en lugar de verificar config_showNavigationBar para que siempre sea anulado por qemu.hw.mainkeys en el simulador

.

public boolean hasNavigationBar() {

return mHasNavigationBar;

}

La asignación de mHasNavigationBar se puede realizar en PhoneWindowManager Encontrado en el método setInitialDisplaySize(Display display, int width, int height, int densidad),

if (!mHasSystemNavBar) {

mHasNavigationBar = mContext.getResources().getBoolean(

también tieneNavigationBar().

String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");

p>

if (! "".equals(navBarOverride)) {

if (navBarOverride.equals("1")) mHasNavigationBar = false;

else if (navBarOverride .equals("0")) mHasNavigationBar = true;

}

} else {

mHasNavigationBar = false;

}< /span>

En el código anterior, puede ver que el valor de mHasNavigationBar se establece en dos lugares:

1. Establezca el archivo de recursos. La ruta del archivo para los valores es frameworks/base/core/res/values/config.xml