Android: Barra de estado transparente con colores dinámicos de la acciónBar y DrawerLayout

Tengo una actividad con un DrawerLayout . Nuestro cliente requiere que cambiemos dinámicamente el color de la barra de acción y el color de la barra de estado correspondiente de esta actividad dependiendo del elemento seleccionado en el DrawerLayout . Esto es fácil de hacer. Sin embargo, mi problema es que no puedo mantener la barra de estado transparente cuando cambie dinámicamente el color de la barra de estado. Cuando abro el cajón, la barra de estado coloreada cubre la parte superior del DrawerLayout esta manera:

Diseño incorrecto

Sin embargo, me gustaría que mi DrawerLayout parezca a esto:

Diseño correcto

Esto se puede hacer con la siguiente línea:

 <item name="android:windowTranslucentStatus">true</item> 

Sin embargo, mi problema no es que no pueda establecer la transparencia de la barra de estado. Mi problema es que el cambio dinámico de la barra de estado y el color de barra de acción no funciona con windowTranslucentStatus . Mi color de barra de estado sigue siendo el colorPrimaryDark (el color amarillo mostaza visible en la barra de estado en las imágenes de arriba) incluso después de llamar a getWindow().setStatusBarColor() .

Ahora, seguí este tutorial y este y este stackoverflow preguntas entre muchos otros, pero no fue capaz de resolver el problema. Todos estos artículos dicen que la ActionBar acción se moverá a la parte superior, por debajo de la barra de estado (de modo que la barra de estado se superpone a la barra de acción) una vez que establezca el windowTranslucentStatus a true . Posteriormente, debería ser capaz de añadir un relleno a la barra de acción y simplemente cambiar el color de la barra de acción también daría lugar a una barra de estado más oscuro del mismo color ya que la barra de estado es realmente translúcida y solapando mi barra de acción. Sin embargo, por alguna razón, esto no sucede en mi caso. La barra de acción permanece donde está si fijo fitsSystemWindows a true o false o quite el atributo por completo. La barra de acción está siempre por debajo de la barra de estado, que es, por supuesto, siempre amarilla si establezco la transparencia.

También he intentado fijar un alfa al color de la barra de estado al cambiarlo programmatically. Esto hace que la barra de estado sea algo transparente, pero parece extraño ya que ya no es muy oscuro . La eliminación del CoordinatorLayout tampoco es de ayuda. He pasado varias horas tratando de arreglar esto y estoy muy frustrado ahora. Cualquier ayuda es muy apreciada.

Mi activity_main :

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start"> <include layout="@layout/app_bar_main" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true"> <include layout="@layout/nav_header_main" /> <android.support.v7.widget.RecyclerView android:id="@+id/nav_menu_recyclerview" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="@dimen/nav_header_height" android:clipToPadding="false" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/size_14dp" app:layoutManager="LinearLayoutManager" /> </android.support.design.widget.NavigationView> </android.support.v4.widget.DrawerLayout> 

Y aquí está el XML de mi app_bar_main :

 <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay" app:elevation="0dp"> <FrameLayout android:id="@+id/toolbar_container" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:popupTheme="@style/AppTheme.PopupOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" /> <com.quintype.sakshipost.Widgets.CustomMaterialSearchView android:id="@+id/search_view" android:layout_width="match_parent" android:layout_height="wrap_content" /> </FrameLayout> </android.support.design.widget.AppBarLayout> <include layout="@layout/content_main" /> </android.support.design.widget.CoordinatorLayout> 

El problema se debe a que getWindow().setStatusBarColor() no funciona bien con DrawerLayout . Con el fin de mantener su barra de estado translúcido, así como ser capaz de cambiar su color, tiene que seguir el siguiente proceso:

Agregue / modifique el siguiente tema en su archivo v21/styles.xml como se muestra a continuación:

 <style name="AppTheme.NoActionBar" parent="AppTheme"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <item name="android:windowTranslucentStatus">true</item> </style> 

Este es el tema que utiliza DrawerLayout estándar (asumiendo, por supuesto, que está utilizando este tema en la actividad que tiene el DrawerLayout ). Esto hará que su barra de estado sea translúcida, como usted ya sabe.

A continuación, elimine android:fitsSystemWindows="true" del CoordinatorLayout en su app_bar_main .

A continuación, donde quiera que cambie el color de la barra de herramientas / barra de estado, use drawerLayout.setStatusBarBackground(colorDrawable) utilizando el mismo color que utiliza para la barra de herramientas (asumiendo, por supuesto, que la referencia a DrawerLayout se denomina drawerLayout ). Tenga en cuenta que el método drawerLayout.setStatusBarBackground() toma un objeto Drawable , a diferencia del método window.setStatusBarColor() , que toma un color int , por lo que puede que tenga que convertir el color en un drawable utilizando algo como esto:

 new ColorDrawable(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary)) 

Esto se asegurará de que su barra de estado es translúcido, así como darle la posibilidad de cambiar los colores. Esperanza usted puede conseguir esto trabajar.

Como se indica aquí , FLAG_TRANSLUCENT_STATUS no debe establecerse.

Para que esto surta efecto, la ventana debe dibujar los fondos de la barra del sistema con FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS y FLAG_TRANSLUCENT_STATUS no debe establecerse.

Hago esto en mi aplicación como esta.

 <style name="AppTheme" parent="Theme.AppCompat.Dark"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> 

ColorPrimary establecerá el color de la barra de estado, pero sólo si reinicia la actividad.

A fin de establecer que a un color negro transparente, a continuación, en su código de reiniciar la actividad. Puede hacer más de un estilo en estilos, con diferentes valores de colorPrimary y, a continuación, en su actividad, haga esto.

 //onClick or condition statement here setTheme(R.style.AppThemeLight); setContentView(R.layout.activity_link_manager_light); restart(); public void restart(){ Intent i = getBaseContext().getPackageManager() .getLaunchIntentForPackage( getBaseContext().getPackageName() ); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); } 

No creo que necesites redefinir el contenido a menos que estés cambiando diseños, así que no estás seguro de que puedes intentar restablecerlo al mismo diseño si no funciona sin él.

Esto definitivamente funciona para mí, pero nunca he intentado utilizar un valor transparente.

Puede utilizar este método para restablecer el tema de la aplicación completa y cambiar a un nuevo diseño que tiene diferentes colores hardcoded en él, sólo deje todo el id es igual en el diseño y en el código que obtendrá el id derecho, siempre que la referencia a la FindViewByID DESPUÉS de que tienes setContentView a la disposición correcta que tiene el ID que llamas en alguna parte. Los identificadores de cada diseño son diferentes, pero siempre obtendrá el ID del diseño que se establece actualmente con setContentView en el momento en que llama a findViewByID.

También puede guardar su tema actual en un archivo sharedpref y utilizar un conmutador para establecer el tema en el aplauso antes de que se llame a setContentView (de lo contrario, el color de la barra de estado no cambiará)

Considere este código. Esto está cerca del comienzo de onCreate por el camino

 String Theme; SaveData = getSharedPreferences(SaveFileName,0); Theme = SaveData.getString("Theme","Default Theme"); switch(Theme){ case "Light Theme": setTheme(R.style.AppThemeLight); setContentView(R.layout.activity_link_manager_light); ListTextViewID = R.id.AppListTextViewLight; ListRowID = R.layout.app_list_item_light; break; 

La manera que fijé el apptheme antes de que fijara el contentview es porqué el cambio del color del statusbar trabaja.

  • Solución automática de laberinto
  • Manejando espacios de nombres Xml con XmlPullParser
  • Variables en los recursos XML: pasa valores de padres a hijos
  • Dibujo de lienzo que no se dibuja correctamente a pesar de las propiedades de configuración
  • Cómo dibujar un círculo dentro de un círculo con formas de Android xml?
  • Problemas con la carga de anuncios de AdMob en la aplicación
  • Custom Switch - el tamaño de la pista y el selector no funcionan por debajo de 21 API
  • Error al analizar XML: prefijo no enlazado en la biblioteca
  • Android: Obtener todas las entradas seleccionadas de MultiSelectListPreference (SharedPreferences)
  • ¿Cómo inserto texto dentro de un rectángulo redondeado en la vista de Android?
  • Android: Configurar la altura del botón en XML en función de su ancho
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.