Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extending MaterialCardView doesn't apply themes

According to the material specifications https://material.io/develop/android/components/material-card-view/ colorSurface applies to the card's Background color .

This works when we are specifying the card in our xml like this

<com.google.android.material.card.MaterialCardView
    android:layout_width="100dp"
    android:layout_height="100dp"></com.google.android.material.card.MaterialCardView>

When I run this I can see color surface properly being applied to the above card.

This also works if I make a card programmatically

addView(MaterialCardView(this).apply {
        layoutParams = ViewGroup.LayoutParams(300,300)
    })

However once I extend from MaterialCardView to make my own custom view , it appears as if the theme connection to this is lost . The color surface is not applied rather the card defaults to white

class CustomView @JvmOverloads constructor(
    context: Context?,
    attributeSet: AttributeSet? = null,
    defStyleAttr: Int = 0
) : MaterialCardView(context, attributeSet, defStyleAttr){

}


<com.seed.formviewactivity.CustomView
        android:layout_width="100dp"
        android:layout_height="100dp"></com.seed.formviewactivity.CustomView>

My CustomView now doesn't have the colorSurface applied.

Is this a known issue ?

like image 706
Muhammad Ahmed AbuTalib Avatar asked Apr 15 '26 17:04

Muhammad Ahmed AbuTalib


1 Answers

In your constructor you are using defStyleAttr: Int = 0.
You should apply the R.attr.materialCardViewStyle as default value instead of 0.

In this way your custom CardView will use the style defined in you app theme by materialCardViewStyle attribute.

The default value provided by the Material Components Library is:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
  <!-- ... -->
  <item name="materialCardViewStyle">@style/Widget.MaterialComponents.CardView</item>
</style>
like image 102
Gabriele Mariotti Avatar answered Apr 17 '26 08:04

Gabriele Mariotti