17

Wie kann ich die Farbe (#000000) einer Form in einer Ebenenliste programmgesteuert ändern?Programmatische Änderung der Formfarbe in der Ebenenliste

Hier ist meine Schicht Liste:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <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> 
+0

möglich Duplikat: http://stackoverflow.com/questions/20705992/changing-color-in-a-shape-inside-a-layer-list-programmatically –

+0

Suhail Mehta gab ein Detail Antwort. Und erklären Sie auch, wie man einzelne Artikelformfarbe einstellt. Es sollte akzeptiert werden Antwort –

Antwort

13

Zuerst müssen Sie ID layer-list Artikel zuweisen.

<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> 

Dann bekommen Sie Ihre Form von ID.

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

Und Sie können die Farbe der Form ändern, indem

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

EDIT

Als getDrawable() veraltet angerufen hat. Verwenden Sie die folgende Codezeile.

LayerDrawable shape = (LayerDrawable) ContextCompat.getDrawable(YourActivity.this,R.drawable.your_shape) 
+2

'getDrawable()' ist veraltet. – user

+0

für mich funktioniert es besser, wenn ich die Layerliste mit getBackground auf dem Widget, das es hat, anstatt es von Ressourcen –

+1

gets Lösung erhalten Diese Lösung hat nicht für mich funktioniert, your_shape ist eine ID und nicht ein Zeichen. Suhails Antwort funktioniert für mich. – Bruce

29
<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> 

Dann einfach in Sie Code

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() jetzt hinzufügen ist veraltet, sollten Sie Verwenden Sie stattdessen ContextCompat.getDrawable(context, color).

Neben, wenn Sie die LayerDrawable von findDrawableByLayerId() erhalten, dann mussten Sie view.setBackground(layerDrawable) aufrufen, damit dies wirksam wird. Alternativ funktionierte auch die Instanziierung der layerDrawable durch view.getBackground().

+0

'getDrawable()' ist veraltet. Gibt es eine andere Art und Weise? – user

+1

@user Verwenden Sie einfach ContextCompat.getDrawable() – Alexander