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?
Sie könnten es einfach so ändern
GradientDrawable bgShape = (GradientDrawable)btn.getBackground();
bgShape.setColor(Color.BLACK);
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);
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
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
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.
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);
LayerDrawable bgDrawable = (LayerDrawable) button.getBackground();
final GradientDrawable shape = (GradientDrawable)
bgDrawable.findDrawableByLayerId(R.id.round_button_shape);
shape.setColor(Color.BLACK);
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)
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);
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
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);
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));
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.