Cómo personalizar la barra de navegación en Android
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