Search code examples
androidkotlinandroid-constraintlayout

how to change the stroke colour programatically in Android


I have a constraintLayout with a style set to it, I want to be able to change. the stroke colour programatically.

what I tried

  val drawable = navigatorLayout.background as GradientDrawable
    drawable.mutate()

but got an error

android.graphics.drawable.LayerDrawable cannot be cast to android.graphics.drawable.GradientDrawable

Fragment

 val drawable = navigatorLayout.background as GradientDrawable
   drawable.mutate()
   drawable.setStroke(3, getColor(R.color.colorSecondary));

constraint layout

                    <androidx.constraintlayout.widget.ConstraintLayout
                        android:id="@+id/navigatorLayout"
                        android:layout_width="match_parent"
                        android:layout_height="40dp"
                        style="@style/SpinnerRounded"
                        android:layout_margin="@dimen/margin_vertical_small"
                        app:layout_constraintTop_toBottomOf="@+id/rgStats"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintEnd_toEndOf="parent">

SpinnerRounded

<style name="SpinnerRounded" parent="Spinner">
        <item name="android:background">@drawable/spinner_rounded_bg</item>
        <item name="android:paddingEnd">16dp</item>
        <item name="android:paddingStart">16dp</item>
    </style>

spinner_rounded_bg

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/grayish_blue"/>
            <corners android:radius="26dp"/>
            <stroke android:width="3dip" android:color="@color/grayish_blue" />
        </shape>
    </item>
</layer-list>

Please suggest what is the better way to change the stroke colour

Thanks R


Solution

  • 1)spinner_rounded_bg. Remove layerlist.And make it as parent. Because it would create a layout drawable.As per your code layer_list not required here.

     <shape android:shape="rectangle">
                <solid android:color="@color/grayish_blue"/>
                <corners android:radius="26dp"/>
                <stroke android:width="3dip" android:color="@color/grayish_blue" />
            </shape>
    

    2)If you need layerlist to be added in xml,you can do like this while setting stroke.

    (drawable as? LayerDrawable?)?.let {
        getDrawable(0)?.setStroke(3, getColor(R.color.colorSecondary));
    }