studio programacion herramientas fundamentos con avanzado aplicaciones android android-layout android-navigation

programacion - manual de android en pdf



Hacer que el cajón de navegación dibuje detrás de la barra de estado (6)

En su directorio "values-v21", agregue estas líneas:

<style name="AppTheme" parent="BaseTheme"> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowSharedElementsUseOverlay">false</item> </style>

Intento crear un Cajón de navegación como el de la especificación de Material (como el de la nueva aplicación de Gmail). Observe cómo el contenido del cajón de navegación dibuja detrás de la barra de estado:

Usando la respuesta de Chris Banes de esta pregunta , pude hacer que el cajón de navegación de la aplicación dibujara con éxito detrás de la barra de estado; eso está funcionando bien. Lo que no funciona es dibujar el contenido del cajón de navegación detrás de la barra de estado. Quiero que la imagen azul en mi cajón se muestre detrás de la barra de estado, pero esa área se dibuja con el color de la barra de estado, como se ve en esta captura de pantalla.

Entonces, ¿cómo puedo hacer que mi cajón de navegación dibuje en el área detrás de la barra de estado? He publicado las partes relevantes de mi proyecto a continuación.

Diseño base que contiene el cajón de navegación:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/nav_drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:fitsSystemWindows="true"> <!-- Framelayout to display Fragments --> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/warning_container" /> <FrameLayout android:id="@+id/navigation_drawer_fragment_container" android:layout_width="300dp" android:layout_height="match_parent" android:fitsSystemWindows="true" android:layout_gravity="start"> <fragment android:id="@+id/navigation_drawer_fragment" android:name="com.thebluealliance.androidclient.fragments.NavigationDrawerFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:layout="@layout/fragment_navigation_drawer" /> </FrameLayout> </android.support.v4.widget.DrawerLayout>

Tema de mi actividad

<style name="AppThemeNoActionBar" parent="AppTheme"> <item name="windowActionBar">false</item> <item name="android:windowNoTitle">true</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:statusBarColor">@android:color/transparent</item> </style>

En onCreate() de mi actividad, hago lo siguiente:

mDrawerLayout.setStatusBarBackground(R.color.primary_dark);


Encontré la mejor manera de hacer esto en Android 5.0. La clave es usar ScrimInsetFrameLayout como elemento raíz del ScrimInsetFrameLayout de navegación (la segunda vista en DrawerLayout ). Esto hará que el contenido se expanda para llenar el espacio detrás de la barra de estado. Para colorear el recuadro correctamente, puede establecer el siguiente atributo en ScrimInsetFrameLayout :

app:insetForeground="#4000"

Además, asegúrese de tener android:fitsSystemWindows="true" en el diseño de la malla.

El código fuente de ScrimInsetFrameLayout se puede encontrar aquí: https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout .Java


Para todos los que luchan con un statusBar translúcido en combinación con un navBar, pero no desean cambiar <style name="yourAppTheme" parent= to "android:Theme.Holo.NoActionBar.TranslucentDecor" , simplemente agreguen estas líneas en su style.xml:

<item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item> <item name="android:windowContentOverlay">@null</item>


Simplemente agregue estos dos valores a su estilo de tema en values-v21

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> .. <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> </style>


Para API 21+

<style name="AppTheme" parent="android:Theme.Holo.NoActionBar.TranslucentDecor"> ... </style>

Para API 19+

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="android:windowTranslucentStatus">true</item> </style>

Su diseño debe tener android:fitsSystemWindows="false" (que es el valor predeterminado).

Ahora, dado que desea alternar la translucidez, puede hacerlo programáticamente:

Window window = getWindow(); // Enable status bar translucency (requires API 19) window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // Disable status bar translucency (requires API 19) window.getAttributes().flags &= (~WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // Set a color (requires API 21) window.setStatusBarColor(Color.RED);

Dejo toda la comprobación de la versión sdk :)


<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:fitsSystemWindows="true"> <include layout="@layout/toolbar" /> <!-- Main layout --> <FrameLayout android:id="@+id/main_fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> <!-- Nav drawer --> <fragment android:id="@+id/fragment_drawer" android:name="com.example.DrawerFragment" android:layout_width="@dimen/drawer_width" android:layout_height="match_parent" android:layout_gravity="left|start" android:fitsSystemWindows="true" /> </android.support.v4.widget.DrawerLayout>

values ​​/ themes.xml

<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowBackground">@color/primary</item> <item name="colorPrimary">@color/primary</item> <item name="colorPrimaryDark">@color/primaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:textColorPrimary">@color/textColorPrimary</item> </style> <style name="AppTheme" parent="AppTheme.Base"> </style>

values-v19 / themes.xml

<style name="AppTheme" parent="AppTheme.Base"> <!--This makes the status bar transparent in KK and Lollipop--> <!--You do not need values-v21 and if you create them make sure you extend from this one--> <item name="android:windowTranslucentStatus">true</item> </style>

Si desea cambiar el color (diferente del negro transparente) de la barra de estado, necesitará ir al otro enfoque con la vista personalizada, porque mDrawerLayout.setStatusBarBackgroundColor(int) solo se activará si este DrawerLayout se ajusta a Windows (sistema de sistema operativo). android:fitsSystemWindows="true" ), y si lo hace no se dibujará detrás de la barra de estado, sino debajo de ella.