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:
- ¿Cómo extender ImageButton correctamente?
- Atributos personalizados del tipo de matriz
- ¿Cómo podemos cambiar el icono de la aplicación Android de forma dinámica en Android
- Actividad de configuración botón Arriba
- Deshabilitar elementos de vista de lista con selector y isEnabled ()
Sin embargo, me gustaría que mi DrawerLayout
parezca a esto:
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>
- Marcador de Google Maps para Android: Released unknown imageData reference
- Mostrar android: dialogMessage en un cuadro de diálogo ListPreference
- Selector con android: drawable = atributo "@ color / transparent"
- Android ¿Es posible definir un mapa en un archivo XML?
- Andorid cordova phonegap config.xml prefijo sin conexión
- No se especifica ninguna orientación y el valor predeterminado es horizontal. Esta es una fuente común de errores cuando los niños se añaden dinámicamente
- Android spinner eliminar dropdown vertical extra espacio / padding
- Cómo generar simple-xml java objeto anotado desde el esquema xsd
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.
- Error: (50, 28) Ningún recurso encontrado que coincida con el nombre dado (en 'valor' con el valor '@ string / google_maps_key')
- Hoja inferior de Android Modal (Diálogo) no se abre completamente