Crear un CardView mediante programación no aplica correctamente el estilo

Estoy tratando de crear un CardView desde el código. Sin embargo, no parece aplicar el estilo correctamente. Aquí están los estilos:

 <style name="CardViewStyle" parent="CardView"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_margin">8dp</item> </style> <style name="Widget.CardContent" parent="android:Widget"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:paddingLeft">16dp</item> <item name="android:paddingRight">16dp</item> <item name="android:paddingTop">24dp</item> <item name="android:paddingBottom">24dp</item> <item name="android:orientation">vertical</item> </style> 

En XML, se vería así:

 <android.support.v7.widget.CardView style="@style/CardViewStyle"> <LinearLayout style="@style/Widget.CardContent"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Title" android:textAppearance="@style/TextAppearance.AppCompat.Title" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Caption"/> </LinearLayout> </android.support.v7.widget.CardView> 

Ahora estoy tratando de hacer exactamente lo mismo en Java:

 CardView card = new CardView(new ContextThemeWrapper(MyActivity.this, R.style.CardViewStyle), null, 0); LinearLayout cardInner = new LinearLayout(new ContextThemeWrapper(MyActivity.this, R.style.Widget_CardContent)); TextView tv_title = new TextView(this); tv_title.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT )); tv_title.setTextAppearance(this, R.style.TextAppearance_AppCompat_Title); tv_title.setText("Name"); TextView tv_caption = new TextView(this); tv_caption.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT )); tv_caption.setText("Sus"); cardInner.addView(tv_title); cardInner.addView(tv_caption); 

Aquí están los resultados. En esta imagen, el primer CardView es creado por XML. El segundo CardView se crea mediante programación. Parece que el segundo no aplica parent="CardView" sólo, como las otras propiedades (layout_width, layout_height, layout_margin) se aplican correctamente.

Por alguna razón, establecer el margen hace que todo vuelva a funcionar.

 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT ); int margin = dpToPixel(8); params.setMargins(margin, margin, margin, margin); card.setLayoutParams(params); 

Tuve un problema similar y esto me ayudó: CardView ha perdido el margen al inflar

Estaba pasando null como padre de View.inflate() a View.inflate() , lo que significaba que los parámetros xml layout_marginLeft etc estaban siendo ignorados.

  • Múltiples archivos styles.xml en Android Studio
  • ¿Por qué el cuadro de diálogo Alerta de Android es NEGRO?
  • EditText El relleno no funciona
  • El estilo no se aplica en la casilla de verificación personalizada y el botón de radio
  • Área de toque de Scrollbar en Android 6
  • Datepicker con estilo diferente a la actividad
  • Android: colores de fondo predeterminados de AppTheme
  • Cómo utilizar el atributo de tema como selector de color
  • Cómo configurar el estilo de un botón en Android?
  • Estilo Android - diferencia entre @style, android :, @android: style, etc
  • Cómo heredar de un estilo especificado de una versión de api diferente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.