setBackground बनाम setBackgroundDrawable (Android)


258

मैं एक दृश्य का बैकग्राउंड ड्रॉबल सेट करना चाहता हूं। इसके लिए दो विधियाँ हैं (जहाँ तक मैं देखता हूँ): setBackgroundऔर setBackgroundDrawable

जब मैं उपयोग करता हूं setBackground, तो यह कहता है कि इसे एपीआई स्तर 16 में जोड़ा गया है, लेकिन मेरी परियोजना का मिनिमम एसडीके संस्करण 7. है। मेरा मानना ​​है कि यह 16 से नीचे की किसी भी चीज पर काम नहीं करने वाला है, क्या मैं सही हूं? लेकिन जब मैं setBackgroundDrawable का उपयोग करता हूं, तो यह कहता है कि यह पदावनत है।

मुझे क्या उपयोग करना चाहिए?


उपयोग करें: image.setImageResource (R.drawable.icon_dot1);
बहादुर

जवाबों:


403

यह पदावनत है, लेकिन यह अभी भी काम करता है इसलिए आप इसका उपयोग कर सकते हैं। लेकिन अगर आप पूरी तरह से सही होना चाहते हैं, तो इसकी पूर्णता के लिए ... आप निम्नलिखित कुछ करना चाहेंगे:

int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    setBackgroundDrawable();
} else {
    setBackground();
}

इस काम के लिए आपको buildTarget api 16 और min build को 7 या कुछ इसी तरह सेट करना होगा।


4
यह अभी भी सेटबैकग्राउंड के बारे में शिकायत करता है कि विघटित को हटा दिया जा सकता है। क्या मुझे वास्तव में सिर्फ इसलिए दबाना पड़ेगा क्योंकि Google विधि नाम बदलना चाहता था?
चार्ली-ब्लेक

2
@ santirivera92 आपके पास हां, वैकल्पिक रूप से आप 2 प्रोजेक्ट बना सकते हैं 1 लक्ष्यीकरण इससे पहले कि यह एक मुद्दा था और 1 के बाद। क्या यह एक आसान विकल्प की तरह लगता है? (वास्तव में कभी-कभी यह करता है, आईसीएस में बहुत सारे सुधार होते हैं)
वॉरज़िट

4
मैं सेट करता हूं android:minSdkVersion="7" android:targetSdkVersion="17", हालांकि सेटबैकग्राउंड () त्रुटि के रूप में सामने आता है: कॉल के लिए एपीआई स्तर 16 (वर्तमान मिनट 7 है) की आवश्यकता है
जॉनी

20
इसने मुझे संकलन करने से रोका। मैंने समस्याग्रस्त कोड को अपने स्वयं के फ़ंक्शन में और अक्षम लिंट को केवल उस फ़ंक्शन के लिए रखा। @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @SuppressWarnings("deprecation") private static void setBg(RelativeLayout layout, BitmapDrawable TileMe) { if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { layout.setBackgroundDrawable(TileMe); } else { layout.setBackground(TileMe); } }
जॉनी

2
@ एसनोलस हां, आईडीई या एंड्रॉइड हमारे लिए इस तरह के तर्क करने में सक्षम होना चाहिए।
वॉरज़पिट

111

आप setBackgroundResource()इसके बजाय एपीआई स्तर 1 में उपयोग कर सकते हैं ।


78
... लेकिन केवल अगर आपको एक ressource id मिली है और आपके द्वारा बनाई गई एक कस्टम ड्रॉएबल क्लास नहीं है!
जोर्डन

आपके पास एक संदर्भ योग्य आईडी की पुनर्प्राप्ति के लिए कोई विधि नहीं है?
पौत्ररथ

2
setBackgroundResource () setBackgroundDrawable () के लिए वैकल्पिक नहीं है; या सेटबैकग्राउंड () ;; संबंधित नहीं है, पहले संसाधन जोड़ने योग्य जोड़ने के लिए और दूसरों को जोड़ने योग्य जोड़ने के लिए।
एमबीएच

क्या होगा अगर मुझे बार-बार बैकग्राउंड सेट करना पड़े, लिस्टव्यू में कहें? setBackgroundResource(int)संसाधन आईडी स्वीकार करता है, इसलिए इसे पृष्ठभूमि सेट करने के लिए प्रत्येक बार दृश्य को बढ़ाना पड़ता है। मुझे इस तरह का व्यवहार नहीं चाहिए, मुझे लगता है कि मैंने पहले ही ड्रॉबल को फुलाया है। क्या मैं कुछ भूल रहा हूँ?
azizbekian 12

क्या होगा अगर मेरे पास केवल ड्रॉबल है?!
MBH

55

ऐसा लगता है कि वर्तमान में 2 कार्यों के बीच कोई अंतर नहीं है, जैसा कि स्रोत कोड ( इस पोस्ट पर क्रेडिट ) में दिखाया गया है :

public void setBackground(Drawable background) {
    //noinspection deprecation
    setBackgroundDrawable(background);
}

@Deprecated
public void setBackgroundDrawable(Drawable background) { ... }

तो यह सिर्फ एक नामकरण निर्णय है, जो मैच-अभिभावक बनाम माता-पिता के समान है।


5
महान! धन्यवाद। मूर्खतापूर्ण है कि एक चेतावनी के रूप में कुछ के लिए एक चेतावनी उत्पन्न होती है एक फ़ंक्शन का नाम बदलें।
किसी ने

1
@ M.kazemAkhgary यह पहली बार नहीं है जब उन्होंने केवल नाम बदलने के लिए कुछ लिखा है। उनके पास "fill_parent" को लेआउट params मूल्यों के लिए "match_parent" में बदला जा रहा था। दोनों बिल्कुल एक ही चीज हैं, एक ही मूल्य की ओर इशारा करते हैं ..
Android डेवलपर

18

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन मेरे पास एक समान स्थिति है, और मेरा समाधान था

button.setBackgroundResource( R.drawable.ic_button );
Drawable d = button.getBackground();

और फिर आप "दराज" के साथ खेल सकते हैं, रंग फिल्टर लागू कर सकते हैं, आदि


6
यह केवल तभी काम करता है जब मूल छवि संसाधन से आ रही हो।
मैट हगिंस

यह भी ओपी के सवाल का जवाब नहीं है।
पेट्रो


12

आप setBackgroundResource()इसके बजाय उपयोग कर सकते हैंrelativeLayout.setBackgroundResource(R.drawable.back);

यह मेरे लिए काम करता है।


7

अब आप उन विकल्पों में से किसी एक का उपयोग कर सकते हैं। और यह किसी भी मामले में काम करने वाला है। आपका रंग इस तरह से एक HEX कोड हो सकता है :

myView.setBackgroundResource(ContextCompat.getColor(context, Color.parseColor("#FFFFFF")));

एक रंग संसाधन , इस तरह:

myView.setBackgroundResource(ContextCompat.getColor(context,R.color.blue_background));

या एक कस्टम xml संसाधन , जैसे:

myView.setBackgroundResource(R.drawable.my_custom_background);

आशा करता हूँ की ये काम करेगा!


6

एंड्रॉइड स्टूडियो 1.5.1 का उपयोग करने पर मुझे निम्नलिखित चेतावनी मिली:

Call requires API level 16 (current min is 9): android.view.View#setBackground

और पदावनति की शिकायतें

'setBackgroundDrawable(android.graphics.drawable.Drawable)' is deprecated

इस प्रारूप का उपयोग करते हुए, मैंने दोनों से छुटकारा पा लिया:

    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
        //noinspection deprecation
        layout.setBackgroundDrawable(drawable);
    } else {
        layout.setBackground(drawable);
    }

1

यह मेरे लिए काम करता है: देखें दृश्य आपका editText, स्पिनर ... आदि है। और int drawable आपका ड्रा करने योग्य मार्ग उदाहरण है (R.drawable.yourDrawable)

 public void verifyDrawable (View view, int drawable){

        int sdk = Build.VERSION.SDK_INT;

        if(sdk < Build.VERSION_CODES.JELLY_BEAN) {
            view.setBackgroundDrawable(
                    ContextCompat.getDrawable(getContext(),drawable));
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            view.setBackground(getResources().getDrawable(drawable));
        }    
    }


-2

मुझे भी यह समस्या थी, लेकिन मैंने ImageView का उपयोग करके वर्कअराउंड किया ।

RelativeLayout का उपयोग करने का प्रयास करें और इसके अंदर एक ImageView जोड़ें (चौड़ाई और ऊंचाई: fill_parent, scaleType: center)।

यह भी सुनिश्चित करें कि इमेजव्यू RelativeLayout के अंदर पहला तत्व है, इसलिए यह पृष्ठभूमि के रूप में कार्य करेगा।


1
वास्तव में यह एक ifखंड से अधिक नहीं होना चाहिए था । सही उत्तर देखें।
पीज्यूसन

-4

आप यह भी कर सकते हैं:

try {
     myView.getClass().getMethod(android.os.Build.VERSION.SDK_INT >= 16 ? "setBackground" : "setBackgroundDrawable", Drawable.class).invoke(myView, myBackgroundDrawable);
} catch (Exception ex) {
     // do nothing
}

संपादित करें: जैसा कि @BlazejCzapp द्वारा बताया गया है कि यदि आप इसके बिना समस्या को हल करने का प्रबंधन कर सकते हैं तो प्रतिबिंब का उपयोग करने से बचना बेहतर है। मेरे पास एक उपयोग का मामला था जहां मैं प्रतिबिंब के बिना हल करने में असमर्थ था, लेकिन यह ऊपर का मामला नहीं है। अधिक जानकारी के लिए कृपया http://docs.oracle.com/javase/tutorial/reflect/index.html पर एक नज़र डालें


4
@BlazejCzapp LOL, लेकिन यह प्रश्न का उत्तर देता है, इसलिए इसे स्पष्टीकरण के बिना अस्वीकृत नहीं किया जाना चाहिए। जब आप किसी बच्चे को यह बताए बिना कुछ नहीं करने के लिए कहते हैं कि वे ऐसा क्यों करेंगे?)
फैब्रिकियो

11
मैं विषय से दूर नहीं जाना चाहता, लेकिन यहाँ कुछ कारण हैं: 1. जावा एक सांख्यिकीय रूप से टाइप की जाने वाली भाषा है - संकलक का उपयोग करें; 2. यह भेस में सिर्फ एक इफ-स्टेटमेंट है (यह सही तर्क को बाधित कर रहा है); 3. यह एक मच्छर को मारने के लिए एक तोप निकाल रहा है - यह कोड एक गंभीर समस्या को हल करने के लिए कुछ गंभीर तोपखाने का उपयोग कर रहा है; आशा है कि इसे कुछ हद तक सही ठहरता है
Błażej Czapp

धन्यवाद @BlazejCzapp, आप सही कह रहे हैं, मेरे पास यहां एक उपयोग का मामला था जहां ऊपर दिए गए कोड जैसी चीजें करना आवश्यक था, लेकिन इसे संभालने का उचित तरीका होने पर इसका उपयोग नहीं किया जाना चाहिए।
फैब्रिकियो

2
यह गूंगा है ... इसे प्राप्त करने के लिए प्रतिबिंब का उपयोग करने का कोई कारण नहीं है।
एलेक्स लॉकवुड

हां किसी ऐसे व्यक्ति को बताएं जिसने एक सरल प्रश्न पूछा "मुझे क्या उपयोग करना चाहिए?" रन-टाइम को संशोधित करना शुरू करें।
पेट्रो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.