Pytanie Zmiana programowo kolorów w kształcie wewnątrz listy warstw


Próbuję zmienić programowo kolor selectable_kachel_shape. Oto plik xml:

kachel_ticked_style.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >


    <item>
        <shape
            android:id="@+id/selectable_kachel_shape"
            android:shape="rectangle" >
            <stroke
                android:width="5dp"
                android:color="@color/headrbar_color" />
        </shape>
    </item>
    <item>
        <rotate
            android:fromDegrees="45"
            android:pivotX="120%"
            android:pivotY="100%"
            android:toDegrees="45" >
            <shape android:shape="line" >
                <stroke
                    android:width="40dp"
                    android:color="@color/headrbar_color" />
            </shape>
        </rotate>
    </item>
    <item
        android:right="5dp"
        android:top="5dp">
        <bitmap
            android:gravity="top|right"
            android:src="@drawable/selectable_tiles_check" />
    </item>

</layer-list>

Wezwam wewnątrz Fragmentu następujący kod

LayerDrawable layers = (LayerDrawable)  this.getActivity().getResources().getDrawable(R.drawable.kachel_ticked_style);

GradientDrawable shape = (GradientDrawable) (layers.findDrawableByLayerId(R.id.selectable_kachel_shape));
                       shape.setColor(this.getActivity().getResources().getColor(android.R.color.background_dark);

1.Dlaczego dostaję wyjątek NullPointerException? shape.setColor?

2.Jak można programowo zmienić kolor wewnątrz kształtu, który znajduje się na liście warstw?


18
2017-12-20 14:38


pochodzenie




Odpowiedzi:


Ok znalazłem odpowiedź, po prostu musiałem umieścić identyfikator kształtu wewnątrz przedmiotu, nie w kształcie kachel_ticked_style.xml:

<item 
    android:id="@+id/selectable_kachel_shape">
        <shape
             android:shape="rectangle" >
            <stroke
                android:width="5dp"
                android:color="@color/headrbar_color" />
        </shape>
    </item>

Następnie możesz zmienić kolor wywołania kształtu shape.setColor lub kolor wywołania obrysu shape.setStroke (strokeWidth, strokeColor)


24
2017-12-23 08:36



Ale mam ten sam problem. To nie działa dla mnie - jincy abraham
Dobrze @jincyabraham można uzyskać widok, a następnie jego tło do rysowania, a następnie uzyskać kształt jak gradientowalny, jak tutaj połączyć - M090009
Czy możesz pokazać, jakie kroki podjąłeś, aby zdobyć obiekt kształtu, nie jest jasne. - Karl Morrison
Działa to dla GradientDrawable, ale nie dla RotateDrawable, którego koloru próbuję zdefiniować w czasie wykonywania. Jakieś pomysły? - Bobbelinio
po prostu za pomocą shape.setColor pracował dla mnie - Fonix