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.

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.

  • ColorDrawable no se puede convertir en android.support.v7.widget.RoundRectDrawableWithShadow
  • CardView layout_width = "match_parent" no coincide con el ancho de RecyclerView padre
  • CardView Haga clic en estado no funciona
  • CardView setCardBackgroundColor no funcionará
  • Crear un CardView mediante programación no aplica correctamente el estilo
  • Error: (27) No se encontró ningún identificador de recurso para el atributo 'srcCompat' en el paquete 'com.example.jaisonjoseph.newsclient'
  • Hacer el ancho de ajuste ImageView de CardView
  • ¿Cómo puedo obtener la posición seleccionada en un RecyclerView?
  • Pasar los datos de los elementos de los clics hechos por RecyclerView CardView a la actividad
  • ¿Cuál es la mejor manera de hacer imágenes deslizantes en cardview dentro de reciclador?
  • Extraño problema de CardView: ("Error al encontrar: com.android.support:cardview-v7:21.0.+" Error)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.