wake-up-neo.com

Wie kann man die Formfarbe dynamisch ändern?

Ich habe 

<?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"
/>

Nun möchte ich, dass diese Form die Farben auf der Grundlage von Informationen ändert, die ich von einem Webservice-Anruf erhalten habe. Es könnte also gelb oder grün oder rot oder was auch immer sein, abhängig von der Farbe, die ich vom Web-Service-Anruf bekomme.

Wie kann ich die Farbe der Form ändern? Basierend auf diesen Informationen?

130
chobo2

Sie könnten es einfach so ändern

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

Bei mir stürzte es ab, weil getBackground eine GradientDrawable anstelle einer ShapeDrawable zurückgegeben hat.

Also habe ich es so modifiziert:

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

Dies funktioniert für mich mit einer anfänglichen XML-Ressource:

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

Ergebnis der obigen Angaben: http://i.stack.imgur.com/hKUR7.png

41
Manuel V.

Sie können Ihre eigenen Formen in Java erstellen. Ich habe dies für ein iPhone wie Page Controler und Paint the shape in Java gemacht: 

/**
 * 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);
}

ich hoffe, das hilft. Griechen Fabian

10
Fabian

Möglicherweise muss ein anderer Benutzer die Farbe in XML ändern, ohne mehrere Zeichenelemente erstellen zu müssen. Machen Sie dann einen Kreis ohne Farbe und legen Sie backgroundTint für die ImageView fest.

circle.xml

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

Und in Ihrem Layout:

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

Bearbeiten:

Es gibt einen Fehler in Bezug auf diese Methode, der verhindert, dass Android Lollipop 5.0 (API-Ebene 21) verwendet wird. Wurden aber in neueren Versionen behoben.

5
nilsi

circle.xml (gezeichnet)

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

layout

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

in Tätigkeit

   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

Diese Lösung funktionierte für mich mit Android sdk 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

Wenn Sie eine Bildansicht wie diese haben: 

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

sie geben ihm eine zeichnbare Form als src. Sie können diesen Code verwenden, um die Farbe der Form zu ändern:

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

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

Meine Aktivität 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" />

Meine Aktivität Java:

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

Ergebnisbild: Ergebnis

1
Abner_Ni

Der einfachste Weg, die Form mit dem Radius zu füllen, ist:

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

Ich versuche Ronnies Antwort und meine App ist abgestürzt. Dann überprüfe ich mein Zeichenbares XML. Es sieht aus wie das:

<selector >...</selector>

. Ich habe es so geändert: (auch Attribute geändert)

<shape> ... </shape>

Es klappt.

Für diejenigen, die das gleiche Problem haben.

0
liang