प्रोग्राम को एंड्रॉइड बटन पर ड्रॉएबलटेफ्ट कैसे सेट करें?


442

मैं गतिशील रूप से बटन बना रहा हूं। मैंने उन्हें पहले XML का उपयोग करते हुए स्टाइल किया, और मैं नीचे XML लेने और इसे प्रोग्रामेटिक बनाने की कोशिश कर रहा हूं।

<Button
    android:id="@+id/buttonIdDoesntMatter"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:text="buttonName"
    android:drawableLeft="@drawable/imageWillChange"
    android:onClick="listener"
    android:layout_width="fill_parent">
</Button>

अभी तक मेरे पास इतना ही है। मैं सबकुछ कर सकता हूं लेकिन ड्रॉ करने योग्य।

linear = (LinearLayout) findViewById(R.id.LinearView);
Button button = new Button(this);
button.setText("Button");
button.setOnClickListener(listener);
button.setLayoutParams(
    new LayoutParams(
        android.view.ViewGroup.LayoutParams.FILL_PARENT,         
        android.view.ViewGroup.LayoutParams.WRAP_CONTENT
    )
);      

linear.addView(button);

जवाबों:


1054

आप ऐसा करने के लिए setCompoundDrawablesविधि का उपयोग कर सकते हैं । उदाहरण यहाँ देखें । मैंने इसका उपयोग किए बिना इसका उपयोग किया setBoundsऔर यह काम किया। आप दोनों तरह से कोशिश कर सकते हैं।

अद्यतन : यहाँ कोड कॉपी करने से लिंक नीचे चला जाता है

Drawable img = getContext().getResources().getDrawable(R.drawable.smiley);
img.setBounds(0, 0, 60, 60);
txtVw.setCompoundDrawables(img, null, null, null);

या

Drawable img = getContext().getResources().getDrawable(R.drawable.smiley);
txtVw.setCompoundDrawablesWithIntrinsicBounds(img, null, null, null);

या

txtVw.setCompoundDrawablesWithIntrinsicBounds(R.drawable.smiley, 0, 0, 0);

@ वरुण, @ टाइगर: मुझे इसमें एक समस्या है: मेरा फिल्म निर्माता एक साक्षात्कार के साथ एक सूची में फ़ोल्डर दिखाता है और एक के रूप में एक फ़ोल्डर आइकन drawableLeft। जब आप बिना पठन अनुमतियों के किसी फ़ोल्डर में क्लिक करते हैं, तो यह आपके सुझावों की कोशिश करता है कि आप "निषिद्ध आइकन" सेट करें, और यह काम करता है। हालाँकि, जब आप फ़ोल्डर बदलते हैं और एडॉप्टर को फिर से लोड किया जाता है, तो निषिद्ध आइकन बना रहता है (जो कि drawableLeftफिर से तैयार नहीं होता है)। क्या आप जानते हैं कि बिना लूप notifyDataSetChangedलिए भी कैसे आवेदन करें drawableLeft? धन्यवाद!
लुइस ए। फ्लोरिट

@ लुइस.फ्लोरिट ऐसा लगता है कि आपके पास Listviewडेटा में बदलाव होने पर किसी वस्तु के पुनर्विकास से संबंधित प्रश्न है - जो वास्तव में इस प्रश्न या उत्तर से संबंधित नहीं है। मेरा सुझाव है कि आप एक टिप्पणी के बजाय एक प्रश्न पोस्ट करें।
टाइगर

@ टाइगर: ठीक है, मैंने आपकी चाल का उपयोग करके आइकन को वापस लौटा दिया, और निषिद्ध dirs पर एक लूप। हो सकता है कि यह सभी ListView आइटम को फिर से शुरू करने से बेहतर हो ... वैसे भी धन्यवाद!
लुइस ए। फ्लोरिट

3
मैं अपने ऐप में कुछ अजीब देख रहा हूं। setCompoundDrawablesWithIntrinsicBounds( 0, 0, R.drawable.money, 0 )नहीं काम करते हैं, अगर मैं layout.xml में drawableRight को परिभाषित करता है। यदि मैं मूल आइकन को अंदर सेट करता हूं onCreate(), तो परिवर्तन काम करता है। क्या यह एपीआई 19 से संबंधित हो सकता है?
इंजेक्टर

उदाहरण लिंक नहीं खुल रहा है। क्या कोई वैकल्पिक लिंक है?
योगेश उमेश वैट

100

बस आप यह भी कोशिश कर सकते हैं

txtVw.setCompoundDrawablesWithIntrinsicBounds(R.drawable.smiley, 0, 0, 0);

4
R.drawable.smiley पहले 0 के स्थान पर होना चाहिए (पहला पैरामीटर) अंतिम नहीं है क्योंकि इस विधि की परिभाषा है: {public void setCompoundDrawablesWithIntrinsicBounds (int बाएँ, int शीर्ष, सही दाएँ, पूर्ण तल पर)}
arniotaki

मैं इसके आसपास भी पैडिंग कैसे जोड़ सकता हूं? इस तरह से ड्रॉबल और टेक्स्ट के बीच ज्यादा पैडिंग नहीं है।
एडमएमसी 331

16

Kotlin Version

बटन पर बाईं ओर जोड़ने योग्य जोड़ने के लिए नीचे स्निपेट का उपयोग करें:

val drawable = ContextCompat.getDrawable(context, R.drawable.ic_favorite_white_16dp)
button.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)

Important Point in Using Android Vector Drawable

जब आप एक एंड्रॉइड वेक्टर का उपयोग कर रहे हैं और 21 से नीचे एपीआई के लिए पिछड़े संगतता चाहते हैं , तो निम्न कोड जोड़ें:

एप्लिकेशन स्तर में build.gradle:

android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}

आवेदन वर्ग में:

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
    }

}

एक सरल तरीका जो मेरे लिए भी काम करता है: button.setCompoundDrawablesWithIntrinsicBounds (getDrawable (R.drawable.ic_favorite_white_16dp), null, null, null)
juangalf

2
आप सही हैं, लेकिन Context#.getDrawable(resId)पदावनत है, इसलिए इसका उपयोग करने से कुछ समस्याएं हो सकती हैं।
एमिनोग्राफी

मैं एक नहीं है, क्योंकि आवेदन वर्ग में जोड़ने के बिना काम करता है।
मार्क डेल्फी



4

इसे मैने किया है:

 // Left, top, right, bottom drawables.
            Drawable[] drawables = button.getCompoundDrawables();
            // get left drawable.
            Drawable leftCompoundDrawable = drawables[0];
            // get new drawable.
            Drawable img = getContext().getResources().getDrawable(R.drawable.ic_launcher);
            // set image size (don't change the size values)
            img.setBounds(leftCompoundDrawable.getBounds());
            // set new drawable
            button.setCompoundDrawables(img, null, null, null);

4

यदि आप drawableStart , drawableEnd , drawableTop या drawableBottom का उपयोग कर रहे हैं ; आपको " setCompoundDrawablesRelativeWithIntrinsicBounds " का उपयोग करना होगा

edittext.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.anim_search_to_close, 0)

3

मेरे लिए काम किया। दाईं ओर खींचने योग्य सेट करने के लिए

tvBioLive.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_close_red_400_24dp, 0)

2

के रूप में @ जेरेमी रेनौड उनका कहना है जिसका विवरण इस सवाल का जवाब , अन्य ड्रॉएबल (ऊपर, ठीक है, और नीचे) के मूल्यों को बदले बिना छोड़ दिया drawable स्थापित करने के लिए सबसे सुरक्षित तरीका के साथ बटन से पिछले मानों का उपयोग करना है setCompoundDrawablesWithIntrinsicBounds :

Drawable leftDrawable = getContext().getResources()
                          .getDrawable(R.drawable.yourdrawable);

// Or use ContextCompat
// Drawable leftDrawable = ContextCompat.getDrawable(getContext(),
//                                        R.drawable.yourdrawable);

Drawable[] drawables = button.getCompoundDrawables();
button.setCompoundDrawablesWithIntrinsicBounds(leftDrawable,drawables[1],
                                               drawables[2], drawables[3]);

तो आपके सभी पिछले ड्रा करने योग्य संरक्षित होंगे।


2

निम्नलिखित पाठ में बाएं आइकन का रंग बदलने का तरीका है और इसे बाईं ओर सेट करें।

 Drawable img = getResources().getDrawable( R.drawable.user );
img.setBounds( 0, 0, 60, 60 );
mNameEditText.setCompoundDrawables(img,null, null, null);

int color = ContextCompat.getColor(this, R.color.blackColor);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    DrawableCompat.setTint(img, color);

} else {
    img.mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN);
}

1

सहायक हो सकता है:

TextView location;
location=(TextView)view.findViewById(R.id.complain_location);
//in parameter (left,top,right,bottom) any where you wnat to put
location.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.arrow,0);

1

एक कोटलिन एक्सटेंशन जोड़ें

यदि आप अक्सर ऐसा करने जा रहे हैं, तो एक्सटेंशन जोड़ने से आपका कोड अधिक पठनीय हो जाता है। बटन TextView का विस्तार करता है; यदि आप अधिक संकीर्ण होना चाहते हैं तो बटन का उपयोग करें।

fun TextView.leftDrawable(@DrawableRes id: Int = 0) {
    this.setCompoundDrawablesWithIntrinsicBounds(id, 0, 0, 0)
}

एक्सटेंशन का उपयोग करने के लिए, बस कॉल करें

view.leftDrawable(R.drawable.my_drawable)

कभी भी आपको खाली करने की आवश्यकता होती है, एक पास को पास न करें या किसी अन्य एक्सटेंशन को कॉल करें removeDrawables


0

इसे इस्तेमाल करे:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
     fillButton[i].setBackground(getBaseContext().getResources().getDrawable(R.drawable.drawable_name));
}
else {
    fillButton[i].setBackgroundColor(Color.argb(255,193,234,203));
}

-8

इसे इस्तेमाल करे:

((Button)btn).getCompoundDrawables()[0].setAlpha(btn.isEnabled() ? 255 : 100);

myEdtiText.setCompoundDrawablesWithIntrinsicBounds (R.drawable.smiley, 0, 0, 0); काम करता है
देबाशीष घोष
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.