2011-08-23 29 views
112

मैं अब मैं इस आकार जानकारी मैं एक वेब सेवा कॉल से वापस पाने के आधार पर रंग बदलना चाहते हैंआकार रंग गतिशील रूप से कैसे बदलें?

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

है तो। तो यह शायद वेब पीरियस कॉल से प्राप्त रंग के आधार पर पीला या हरा या लाल हो सकता है या जो भी हो।

मैं आकार का रंग कैसे बदल सकता हूं? इस जानकारी के आधार पर?

+3

जैसा कि @Couitchy विधि 'View.getBackground() द्वारा नियुक्त किया गया है, संदर्भ को प्राप्त करने और रंग को प्रोग्रामेटिक रूप से सेट करने के दौरान अमान्य कलाकारों के कारण, रनटाइम पर ऐप को क्रैश करने के कारण' ग्रेडडिएबल ' । [एंड्रॉइड आकार दस्तावेज़] (http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape) कहता है: * समेकित संसाधन डेटाटाइप: संसाधन सूचक 'ग्रेडियेंट ड्रायबल' * पर। –

उत्तर

249

आप इसे बस इस

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

btn.getBackground क्या है? – chobo2

+0

बीटीएन कोई भी दृश्य हो सकता है जिसके लिए आपने एक्सएमएल से आरेखण आकार निर्धारित किया है। तो आप उस दृश्य पर getBackground() का उपयोग करके खींचने योग्य वापस प्राप्त कर सकते हैं और उसका रंग बदल सकते हैं। – Ronnie

+1

हम्म को इस कोड को मोनोड्रॉइड में कनवर्ट करने के लिए कठिन समय है। आकार बदलने योग्य bgShape = (आकार बदलने योग्य) संसाधन। GetDrawable (Resource.Drawable.test); बस क्रैश – chobo2

10

आप जावा में अपना खुद का आकार बना सकते हैं। मैं पृष्ठ Controler की तरह एक iPhone के लिए ऐसा किया और जावा में आकार रंग:

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

आशा है कि यह मदद करता है। Greez फैबियन

51

मेरे लिए की तरह संशोधित कर सकता है, यह दुर्घटनाग्रस्त हो गया क्योंकि getBackground एक ShapeDrawable के GradientDrawable लौटे बजाय।

तो मैं इसे इस तरह से संशोधित किया गया:

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

धन्यवाद महान काम कर रहा है :) –

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

यह मेरे लिए काम करता है, एक प्रारंभिक xml संसाधन के साथ:

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

ऊपर का परिणाम: http://i.stack.imgur.com/hKUR7.png

+0

यह सही जवाब है। ऊपर उल्लिखित उत्तरों दोनों मेरे लिए काम नहीं कर रहे थे। मुझे दोनों पर अपवाद मिल रहा है। –

2

यह समाधान एंड्रॉइड एसडीके 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

आप इस तरह एक imageView है:

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

हो सकता है कि किसी और की जरूरत:

<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 के रूप में एक drawable आकार देने, तुम आकार का रंग बदलने के लिए इस कोड का उपयोग कर सकते हैं एक्सएमएल में रंग बदलने के लिए मुझे कई ड्रॉबल्स बनाने के बिना जरूरी है। फिर रंग के बिना एक वृत्त खींचने योग्य बनाएं और फिर ImageView के लिए पृष्ठभूमि टिंट निर्दिष्ट करें।

circle.xml

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

और अपने लेआउट में:

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

संपादित करें:

इस विधि यह है कि यह काम करने से रोकता के बारे में एक bug है एंड्रॉइड लॉल पर आईपॉप 5.0 (एपीआई स्तर 21)। लेकिन नए संस्करणों में तय किया गया है।

1

मेरे आकार 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> 

मेरे गतिविधि 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" /> 

मेरे गतिविधि जावा:

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

परिणाम चित्र: +०१२३१५८५०३

3

circle.xml (drawable)

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

लेआउट

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

गतिविधि

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

में मैं रोनी के जवाब की कोशिश, और मेरे एप्लिकेशन दुर्घटनाग्रस्त हो गया। फिर मैं अपने ड्रॉइंग एक्सएमएल की जांच करता हूं। ऐसा लगता है:

<selector >...</selector> 

। मैंने इसे बदल दिया: (गुण भी बदल दिए गए)

<shape> ... </shape> 

यह काम करता है।

उन लोगों के लिए जो एक ही समस्या का सामना करते हैं।

संबंधित मुद्दे