web-dev-qa-db-fra.com

Comment changer la couleur de forme dynamiquement?

J'ai 

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:shape="rectangle">
    <solid
       Android:color="#FFFF00" />
    <padding Android:left="7dp"
        Android:top="7dp"
        Android:right="7dp"
        Android:bottom="7dp" />
</shape>

<TextView
    Android:background="@drawable/test"
    Android:layout_height="45dp"
    Android:layout_width="100dp"
    Android:text="Moderate"
/>

Alors maintenant, je veux que cette forme change de couleur en fonction des informations que je récupère d'un appel de service Web. Cela peut donc être jaune, vert ou rouge, ou autre chose, en fonction de la couleur que je reçois de l'appel du service Web.

Comment puis-je changer la couleur de la forme? Basé sur cette information?

130
chobo2

Vous pouvez le modifier simplement comme ceci

GradientDrawable bgShape = (GradientDrawable)btn.getBackground();
bgShape.setColor(Color.BLACK);
280
Ronnie

Pour moi, il s'est écrasé car getBackground a renvoyé une GradientDrawable au lieu d'une ShapeDrawable.

Donc je l'ai modifié comme ça:

((GradientDrawable)someView.getBackground()).setColor(someColor);
58
Couitchy

Cela fonctionne pour moi, avec une ressource XML initiale:

example.setBackgroundResource(R.drawable.myshape);
GradientDrawable Gd = (GradientDrawable) example.getBackground().getCurrent();
Gd.setColor(Color.parseColor("#000000"));
Gd.setCornerRadii(new float[]{30, 30, 30, 30, 0, 0, 30, 30});
Gd.setStroke(2, Color.parseColor("#00FFFF"), 5, 6);

Résultat de ce qui précède: http://i.stack.imgur.com/hKUR7.png

41
Manuel V.

Vous pouvez créer vos propres formes en Java. Je l'ai fait pour un iPhone comme Page Controler et Paint the shape in Java 

/**
 * Builds the active and inactive shapes / drawables for the page control
 */
private void makeShapes() {

    activeDrawable = new ShapeDrawable();
    inactiveDrawable = new ShapeDrawable();
    activeDrawable.setBounds(0, 0, (int) mIndicatorSize,
            (int) mIndicatorSize);
    inactiveDrawable.setBounds(0, 0, (int) mIndicatorSize,
            (int) mIndicatorSize);

    int i[] = new int[2];
    i[0] = Android.R.attr.textColorSecondary;
    i[1] = Android.R.attr.textColorSecondaryInverse;
    TypedArray a = this.getTheme().obtainStyledAttributes(i);

    Shape s1 = new OvalShape();
    s1.resize(mIndicatorSize, mIndicatorSize);
    Shape s2 = new OvalShape();
    s2.resize(mIndicatorSize, mIndicatorSize);

    ((ShapeDrawable) activeDrawable).getPaint().setColor(
            a.getColor(0, Color.DKGRAY));
    ((ShapeDrawable) inactiveDrawable).getPaint().setColor(
            a.getColor(1, Color.LTGRAY));

    ((ShapeDrawable) activeDrawable).setShape(s1);
    ((ShapeDrawable) inactiveDrawable).setShape(s2);
}

espérons que cela aide . Greez Fabian

10
Fabian

Peut-être que quelqu'un d'autre a besoin de changer de couleur dans le XML sans créer plusieurs dessinables comme j'en avais besoin. Créez ensuite un cercle dessinable sans couleur, puis spécifiez backgroundTint pour ImageView.

circle.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:shape="oval">
</shape>

Et dans votre layout:

<ImageView
    Android:layout_width="50dp"
    Android:layout_height="50dp"
    Android:background="@drawable/circle"
    Android:backgroundTint="@color/red"/>

Modifier:

Il existe un bug concernant cette méthode qui l'empêche de fonctionner sur Android Lollipop 5.0 (niveau 21 de l'API). Mais ont été corrigés dans les versions les plus récentes.

5
nilsi

circle.xml (dessinable)

<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">

<solid
    Android:color="#000"/>

<size
    Android:width="10dp"
    Android:height="10dp"/>
</shape>

disposition

<ImageView
      Android:id="@+id/circleColor"
      Android:layout_width="15dp"
       Android:layout_height="15dp"
      Android:textSize="12dp"
       Android:layout_gravity="center"
       Android:layout_marginLeft="10dp"
      Android:background="@drawable/circle"/>

en activité

   circleColor = (ImageView) view.findViewById(R.id.circleColor);
   int color = Color.parseColor("#00FFFF");
   ((GradientDrawable)circleColor.getBackground()).setColor(color);
5
A. Shukri
    LayerDrawable bgDrawable = (LayerDrawable) button.getBackground();
    final GradientDrawable shape = (GradientDrawable)
            bgDrawable.findDrawableByLayerId(R.id.round_button_shape);
    shape.setColor(Color.BLACK);
5
user3717188

Cette solution a fonctionné pour moi avec le sdk Android v19:

//get the image button by id
ImageButton myImg = (ImageButton) findViewById(R.id.some_id);

//get drawable from image button
GradientDrawable drawable = (GradientDrawable) myImg.getDrawable();

//set color as integer
//can use Color.parseColor(color) if color is a string
drawable.setColor(color)
2
Jay Paulynice

Si vous avez une image comme celle-ci: 

   <ImageView
    Android:id="@+id/color_button"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginRight="10dp"
    Android:src="@drawable/circle_color"/>

qui lui donne une forme dessinable en tant que src, vous pouvez utiliser ce code pour changer la couleur de la forme:

ImageView iv = (ImageView)findViewById(R.id.color_button);
GradientDrawable bgShape = (GradientDrawable)iv.getDrawable();
bgShape.setColor(Color.BLACK);
2
Hamed Gh

Ma forme xml: 

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<solid  Android:color="@Android:color/transparent" />
<stroke Android:width="0.5dp" Android:color="@Android:color/holo_green_dark"/>
</shape>

Mon activité xml:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context="cn.easydone.test.MainActivity">

<Android.support.design.widget.AppBarLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:theme="@style/AppTheme.AppBarOverlay">

    <Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="?attr/actionBarSize"
        Android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />
    <TextView
        Android:id="@+id/test_text"
        Android:background="@drawable/bg_stroke_dynamic_color"
        Android:padding="20dp"
        Android:text="asdasdasdasd"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"/>

</Android.support.design.widget.AppBarLayout>

<Android.support.v7.widget.RecyclerView
    Android:id="@+id/recycler_view"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:padding="10dp"
    Android:clipToPadding="false"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

Mon activité Java:

 TextView testText = (TextView) findViewById(R.id.test_text);
 ((GradientDrawable)testText.getBackground()).setStroke(10,Color.BLACK);

Image de résultat: result

1
Abner_Ni

La manière la plus simple de remplir la forme avec le Radius est la suivante:

XML:

<TextView
    Android:id="@+id/textView"
    Android:background="@drawable/test"
    Android:layout_height="45dp"
    Android:layout_width="100dp"
    Android:text="Moderate"/>

Java:

(textView.getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);
0
SANAT

drawable_rectangle.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:shape="rectangle">

    <solid Android:color="@Android:color/transparent" />

    <stroke
        Android:width="1dp"
        Android:color="#9f9f9f" />

    <corners
        Android:bottomLeftRadius="5dp"
        Android:bottomRightRadius="5dp"
        Android:topLeftRadius="5dp"
        Android:topRightRadius="5dp" />

</shape>

TextView

<androidx.appcompat.widget.AppCompatTextView
    Android:id="@+id/textView"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:background="@drawable/drawable_rectangle"
    Android:gravity="center"
    Android:padding="10dp"
    Android:text="Status"
    Android:textColor="@Android:color/white"
    Android:textSize="20sp" />


public static void changeRectangleColor(View view, int color) {
    ((GradientDrawable) view.getBackground()).setStroke(1, color);
}    

changeRectangleColor(textView, ContextCompat.getColor(context, R.color.colorAccent));
0
Ketan Ramani

J'essaie de répondre à Ronnie et mon application s'est bloquée. Ensuite, je vérifie mon XML dessinable. Cela ressemble à ceci:

<selector >...</selector>

. Je l'ai changé en ceci: (également changé d'attributs)

<shape> ... </shape>

Ça marche.

Pour ceux qui rencontrent le même problème.

0
liang