Programmatically change color of shape in layer list

后端 未结 4 2107
礼貌的吻别
礼貌的吻别 2020-12-28 14:24

How can I programmatically change the color (#000000) of a shape in a layer list?

Here is my layer list:



        
相关标签:
4条回答
  • 2020-12-28 14:34
    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:id="@+id/outer">
            <shape xmlns:android="http://schemas.android.com/apk/res/android"
                android:shape="oval">
                <size android:height="40dp" android:width="40dp"/>
                <padding android:top="3dp" android:bottom="3dp" android:right="3dp" android:left="3dp"/>
                <stroke
                    android:width="1dp"
                    android:color="#ffffff"/>
            </shape>
        </item>
    
        <item android:id="@+id/middle">
            <shape xmlns:android="http://schemas.android.com/apk/res/android"
                android:shape="oval">
                <size android:height="40dp" android:width="40dp"/>
                <padding android:top="2dp" android:bottom="2dp" android:right="2dp" android:left="2dp"/>
                <stroke
                    android:width="3dp"
                    android:color="#ffffff"/>
            </shape>
        </item>
    
        <item android:id="@+id/inner">
            <shape xmlns:android="http://schemas.android.com/apk/res/android"
                android:shape="oval">
                <size android:height="40dp" android:width="40dp"/>
                <solid
                    android:color="#ffffff"/>
            </shape>
        </item>
    </layer-list>
    

    Find your view

    LayerDrawable layerDrawable = (LayerDrawable) yourView.getBackground();
    GradientDrawable outer = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.outer);
    GradientDrawable middle = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.middle);
    GradientDrawable inner = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.inner);
    

    Set color

    outer.setColor(Color.parseColor(#000000));
    inner.setColor(Color.parseColor(#FFFFFF));
    
    0 讨论(0)
  • 2020-12-28 14:39

    First of all you need to assign id to you layer-list item.

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- First assign id to the list item-->
        <item  android:id="@+id/your_shape">  
            <shape android:shape="rectangle">
                <solid android:color="#000000" /> 
            </shape>
        </item>
        <item android:left="5dp">
            <shape android:shape="rectangle">
                <solid android:color="@color/bg" />
            </shape>
        </item>
    </layer-list>
    

    Then get your shape by id.

    LayerDrawable shape = (LayerDrawable) getResources().getDrawable(R.drawable.your_shape)
    

    And you can change the color of your shape by calling

    shape.setColor(Color.Black); // changing to black color
    

    EDIT

    As getDrawable() has been deprecated. Use the following line of code.

    LayerDrawable shape = (LayerDrawable) ContextCompat.getDrawable(YourActivity.this,R.drawable.your_shape)
    
    0 讨论(0)
  • 2020-12-28 14:42
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@+id/gradientDrawble"> // Give id
            <shape android:shape="rectangle">
                <solid android:color="#000000" /> // CHANGE THIS COLOR
            </shape>
        </item>
        <item android:left="5dp">
            <shape android:shape="rectangle">
                <solid android:color="@color/bg" />
            </shape>
        </item>
    </layer-list>
    

    Then in you code just add

    LayerDrawable layerDrawable = (LayerDrawable) getResources()
                .getDrawable(R.drawable.my_drawable);
    GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable
                .findDrawableByLayerId(R.id.gradientDrawble);
    gradientDrawable.setColor(color); // change color
    

    Update Oct-2016

    getDrawable() is now deprecated, you should use ContextCompat.getDrawable(context, color) instead.

    Beside, if you get the LayerDrawable by findDrawableByLayerId(), then you had to call view.setBackground(layerDrawable) for this to take effect. Alternatively, instantiating the layerDrawable by view.getBackground() also worked.

    0 讨论(0)
  • 2020-12-28 14:51

    You can also get the drawable or background of the view and set it as follows.

    LayerDrawable layerDrawable = (LayerDrawable) view.getDrawable(); //view.getBackground()
    GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable
                    .findDrawableByLayerId(R.id.layer_list_item_id);
    gradientDrawable.setColor(ContextCompat.getColor(getContext(), R.color.colorPrimary));
    
    0 讨论(0)
提交回复
热议问题