Şekil rengini dinamik olarak nasıl değiştirebilirim?


136

Sahibim

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

Şimdi bu şeklin, bir web servis çağrısından aldığım bilgilere dayanarak renkleri değiştirmesini istiyorum. Bu yüzden belki sarı veya yeşil veya kırmızı veya web serivce çağrısından aldığım renge bağlı olarak herhangi bir şey olabilir.

Şeklin rengini nasıl değiştirebilirim? Bu bilgilere dayanarak?


3
@Couitchy yöntemi tarafından atanan, başvuruyu almaya çalışırken ve rengi programlı olarak ayarlamaya çalışırken geçersiz döküm nedeniyle uygulamanın çalışma zamanında çökmesine neden olmayan View.getBackground()bir GradientDrawableve döndürmez ShapeDrawable. [Android Shape doc] ( geliştirici.android.com/ guide/topics/resources/…GradientDrawable ) ifadeleri : DERLENMİŞ KAYNAK VERİ TÜRÜ: a .
Luis Quijada

Yanıtlar:


300

Sadece bu şekilde değiştirebilirsiniz

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

9
Btn.getBackground dosyası nedir?
chobo2

16
java.lang.ClassCastException: android.graphics.drawable.GradientDrawable cannot be cast to android.graphics.drawable.ShapeDrawableBu öneriyi denerken alıyorum .
prolink007

2
Çalışmıyor. Yayınlama hatası alırsınız. Bir düzeltme veya başka bir yanıtın kabul edilmesi gerekiyor
ndgreen

6
Bu gayet iyi çalışıyor. Cevabın düzenlenmesinden bu yana önceki yorumlar geçmişte kaldı!
W3hri

4
GradientDrawable kullanmalı bgShape = (GradientDrawable) btn.getBackground (). getCurrent ();
naveed148

60

Benim için çöktü çünkü yerine a getBackgrounddöndürdü .GradientDrawableShapeDrawable

Yani ben böyle değiştirdim:

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

42

Bu benim için, ilk xml kaynağı ile çalışır:

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

Yukarıdakilerin sonucu: http://i.stack.imgur.com/hKUR7.png


Bu doğru cevap. Yukarıda yazılan cevapların ikisi de benim için işe yaramadı. Her ikisinde de istisna alıyorum.
Sanal Varghese

10

Java'da kendi şekillerinizi oluşturabilirsiniz. Bunu Sayfa Denetleyici gibi bir iPhone için yaptım ve Java'daki şekilleri boyadım:

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

Bu yardımcı olur umarım. Greez Fabian


8

Belki bir başkasının ihtiyacım gibi birden fazla çekmecesi yaratmadan XML'deki rengi değiştirmesi gerekiyor. Ardından renksiz bir daire çizin ve ardından ImageView için backgroundTint belirtin.

circle.xml

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

Ve düzeninizde :

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

Düzenle:

Bu yöntemle ilgili olarak Android Lollipop 5.0 (API düzey 21) üzerinde çalışmasını engelleyen bir hata var . Ancak daha yeni sürümlerde düzeltildi.


5
    LayerDrawable bgDrawable = (LayerDrawable) button.getBackground();
    final GradientDrawable shape = (GradientDrawable)
            bgDrawable.findDrawableByLayerId(R.id.round_button_shape);
    shape.setColor(Color.BLACK);

Round_button_shape şekil xml dosyasında nerede tanımlanmalıdır?
Jayesh

5

circle.xml (çekilebilir)

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

Yerleşim

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

faaliyette

   circleColor = (ImageView) view.findViewById(R.id.circleColor);
   int color = Color.parseColor("#00FFFF");
   ((GradientDrawable)circleColor.getBackground()).setColor(color);

Mükemmel değil, ama çözümü bulmama yardım etti.
Rakesh Yadav

2

Bu çözüm android sdk v19 kullanarak benim için çalıştı:

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

Böyle bir imageView'iniz varsa:

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

src olarak çizilebilir bir şekil veren şeklin rengini değiştirmek için bu kodu kullanabilirsiniz:

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

1

Benim şekil 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>

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

Aktivite java'm:

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

Sonuç resmi: sonuç


1

Şekli Yarıçap ile doldurmanın en basit yolu :

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

Ronnie'nin cevabını deniyorum ve uygulamam çöktü. Sonra çekilebilir xml kontrol. Şöyle görünüyor:

<selector >...</selector>

. Bunu şu şekilde değiştirdim: (öznitelikleri de değiştirdi)

<shape> ... </shape>

İşe yarıyor.

Aynı problemle karşılaşanlar için.


0

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>

Metin görünümü

<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

Bunu başarmak için bir ciltleme adaptörü (Kotlin) kullanabilirsiniz. Aşağıdaki gibi ChangeShapeColor adında bir bağlayıcı bağdaştırıcı sınıfı oluşturun

@BindingAdapter("shapeColor")

// Method to load shape and set its color 

fun loadShape(textView: TextView, color: String) {
// first get the drawable that you created for the shape 
val mDrawable = ContextCompat.getDrawable(textView.context, 
R.drawable.language_image_bg)
val  shape =   mDrawable as (GradientDrawable)
// use parse color method to parse #34444 to the int 
shape.setColor(Color.parseColor(color))
 }

Res / drawable klasöründe çizilebilir bir şekil oluşturun. Bir çevre oluşturdum

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<solid android:color="#anyColorCode"/>

<size
    android:width="@dimen/dp_16"
    android:height="@dimen/dp_16"/>
</shape>

Sonunda görünümüne yönlendir

  <TextView>
   .........
  app:shapeColor="@{modelName.colorString}"
 </Textview>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.