Adjuntar estilo CardView personalizado al tema

En mi aplicación, tengo dos temas (claro y oscuro), y quiero que todos mis CardView s cambien su color de fondo dependiendo del tema seleccionado.

Lo que no quiero es:

 <android.support.v7.widget.CardView style="@style/CardView.MyBlue" android:layout_width="200dp" android:layout_height="100dp" android:layout_gravity="center_horizontal"> 

El código anterior no es dinámico. Necesito que mis dos estilos se apliquen automáticamente dependiendo de si un tema ligero o oscuro es seleccionado.


Lo que tengo ahora no funciona:

 <style name="AppTheme.Light" parent="Theme.AppCompat.Light"> ... <item name="cardViewStyle">@style/CardViewStyle.Light</item> </style> <style name="AppTheme.Dark" parent="Theme.AppCompat"> ... <item name="cardViewStyle">@style/CardViewStyle.Dark</item> </style> <style name="CardViewStyle.Light" parent="CardView"> <item name="cardBackgroundColor">@color/cardview_dark_background</item> </style> <style name="CardViewStyle.Dark" parent="CardView"> <item name="cardBackgroundColor">@color/cardview_light_background</item> </style> 

He leído en algún lugar que se puede definir un archivo styleable.xml en /res/values/ para clave la palabra cardViewStyle , así que hice eso:

styleable.xml:

 <resources> <declare-styleable name="AppTheme"> <attr name="cardViewStyle" format="reference" /> </declare-styleable> </resources> 

Actualizar

Pregunta similar aquí sin respuesta tampoco.

3 Solutions collect form web for “Adjuntar estilo CardView personalizado al tema”

En styles.xml

 <resources> <attr format="reference" name="cardStyle"/> <style name="Light" parent="Theme.AppCompat.NoActionBar"> <item name="cardStyle">@style/CardView.Light</item> ... </style> <style name="Dark" parent="Theme.AppCompat.NoActionBar"> <item name="cardStyle">@style/CardView.Dark</item> ... </style> </resources> 

A continuación, en su otro xml para utilizar el nuevo atributo, lo utilizaría como este

 style="?attr/cardStyle" 

Para mostrar más detalles sobre cómo implementar la solución de David Park …

Ponga esto en attrs.xml:

 <declare-styleable name = "cardStyle"> <attr name="cardStyle" format="reference" /> </declare-styleable> <style name="Light" parent="Theme.AppCompat.NoActionBar"> <item name="cardStyle">@style/CardView.Light</item> </style> <style name="Dark" parent="Theme.AppCompat.NoActionBar"> <item name="cardStyle">@style/CardView.Dark</item> </style> 

A continuación, agregue cardStyle a su tema en styles.xml:

 <style name="AppThemeLight" parent="AppTheme.Base"/> <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar"> <item name="cardStyle">@style/CardView.Light</item> </style> <style name="AppThemeDark" parent="AppTheme.Base.Dark"/> <style name="AppTheme.Base.Dark" parent="Theme.AppCompat.NoActionBar"> <item name="cardStyle">@style/CardView.Dark</item> </style> 

A continuación, utilice el attr donde quiera que tenga un CardView:

 <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/header_card" android:layout_width="match_parent" android:layout_height="wrap_content" card_view:cardCornerRadius="2dp" card_view:cardElevation="2dp" style="?attr/cardStyle"> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:id="@+id/header_title" </android.support.v7.widget.CardView> 

La única solución que he podido encontrar es mantener manualmente una variable constante para el color de la tarjeta debe ser después de cada cambio de tema. Entonces, consigo cada caso de una tarjeta que está en mi aplicación y fijo su color a esa variable constante.

Por lo tanto, tengo una BaseActivity de la cual todas mis actividades se extienden desde. En él, manejo el cambio de color de la tarjeta además de manejar el tema. Vea abajo:

BaseActivity.java :

 public class BaseActivity extends ActionBarActivity { private static final int DEFAULT_THEME_ID = R.style.AppTheme_Dark; @Override protected void onCreate(Bundle savedInstanceState) { int theme_id = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getInt("THEME_ID", DEFAULT_THEME_ID); setTheme(theme_id); int card_color; if (theme_id == DEFAULT_THEME_ID){ card_color = R.color.cv_dark; } else{ card_color = R.color.cv_light; } Constants.CARD_COLOR = card_color; super.onCreate(savedInstanceState); } } 

Esto definitivamente no es la mejor manera de hacer esto, pero hasta que alguien más puede encontrar una mejor manera de implementar el estilo, esto es todo lo que puedo pensar.

  • Cómo utilizar OnClickListner en CardView en un RecyclerView?
  • Cómo traer imageView delante de cardview? Cuando ambos son de Disposición Relativa childs
  • Android Resalte la tarjeta como modal de diálogo dentro de recyclerview en clic
  • Establecer márgenes en cardview de forma programática
  • ¿Cómo saber cuando el RecyclerView ha terminado de colocar los artículos?
  • Ronda sólo esquina superior de cardview
  • GetAdapterPosition () no devuelve la posición del elemento en RecyclerView
  • Cómo insertar ListView en CardView con barra de desplazamiento fuera de CardView?
  • Error al inflar la clase y android.support.v7.widget.CardView
  • Android NestedScrollView alinear el contenido en la parte superior
  • Diferentes resultados de CardView de la Biblioteca de soporte de Android en diferentes dispositivos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.