setBackground vs setBackgroundDrawable (Android)


258

ฉันต้องการตั้งค่าพื้นหลังที่สามารถวาดได้ในมุมมอง มีสองวิธีการนี้ (เท่าที่ผมดู) และsetBackgroundsetBackgroundDrawable

เมื่อฉันใช้setBackgroundมันบอกว่ามันถูกเพิ่มเข้ามาในAPI ระดับ 16แต่เวอร์ชันต่ำสุดของ SDK ของฉันคือ 7 ฉันคิดว่ามันจะไม่ทำงานกับอะไรที่ต่ำกว่า 16 ใช่ไหม แต่เมื่อฉันใช้ setBackgroundDrawable มันบอกว่ามันเลิกใช้แล้ว

ฉันควรใช้อะไรดี


ใช้: image.setImageResource (R.drawable.icon_dot1);
Brave

คำตอบ:


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
มันยังคงบ่นเกี่ยวกับ setBackgroundDrawable ที่ถูกคัดค้าน ฉันต้องระงับคำพูดเพราะ Google ต้องการเปลี่ยนชื่อวิธีหรือไม่?
Charlie-Blake

2
@ santirivera92 ใช่คุณมีหรือคุณสามารถสร้าง 2 โครงการ 1 การกำหนดเป้าหมายก่อนที่จะเป็นปัญหาและ 1 หลังจาก เสียงนั้นเป็นตัวเลือกที่ง่ายใช่ไหม (อันที่จริงบางครั้งมันทำแก้ไขได้มากมายใน ICS)
Warpzit

4
ฉันตั้งค่าandroid:minSdkVersion="7" android:targetSdkVersion="17"อย่างไรก็ตาม setBackground () ออกมาเป็นข้อผิดพลาด: การโทรต้องใช้ระดับ API 16 (ขั้นต่ำปัจจุบันคือ 7)
Jonny

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

2
@Snicolas ใช่ IDE หรือ Android น่าจะทำสิ่งนี้ได้สำหรับพวกเรา
Warpzit

111

คุณสามารถใช้setBackgroundResource()แทนซึ่งอยู่ในระดับ API 1


78
... แต่เฉพาะในกรณีที่คุณมีรหัส ressource และไม่ใช่คลาสที่กำหนดเองได้ที่คุณสร้างขึ้น!
Zordid

ไม่มีวิธีในการเรียกคืน ID ของ drawable ที่คุณมีการอ้างอิงหรือไม่
Poutrathor

2
setBackgroundResource () ไม่ใช่ทางเลือกอื่นสำหรับ setBackgroundDrawable (); หรือ setBackground (); ไม่เกี่ยวข้องเลยคนแรกที่เพิ่มทรัพยากร drawable และคนอื่น ๆ เพื่อเพิ่ม drawable ที่กำหนดเอง
MBH

ถ้าฉันต้องตั้งพื้นหลังซ้ำ ๆ ให้พูดใน listview? setBackgroundResource(int)ยอมรับ id ทรัพยากรดังนั้นจึงต้องขยายมุมมองในแต่ละครั้งเพื่อตั้งค่าพื้นหลัง ฉันไม่ต้องการพฤติกรรมดังกล่าวโดยสมมติว่าฉันมี Drawable ที่สูงเกินจริงแล้ว ฉันพลาดอะไรไปรึเปล่า?
azizbekian

เกิดอะไรขึ้นถ้าฉันมีเพียง drawable!
MBH

55

ดูเหมือนว่าขณะนี้มีความแตกต่างระหว่าง 2 ฟังก์ชั่นไม่เป็นที่แสดงบนรหัสต้นฉบับ (เครดิตให้กับโพสต์นี้ ):

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

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

ดังนั้นมันจึงเป็นการตัดสินใจตั้งชื่อคล้ายกับการจับคู่แบบเติมผู้ปกครองกับการจับคู่ผู้ปกครอง


5
ที่ดี! ขอบคุณ เซ่อว่ามีการสร้างคำเตือนสำหรับบางสิ่งบางอย่างที่อ่อนแอเช่นเปลี่ยนชื่อฟังก์ชั่น
คนอยู่ที่ไหนสักแห่ง

1
@ M.kazemAkhgary ไม่ใช่ครั้งแรกที่พวกเขาเลิกใช้สิ่งเฉพาะสำหรับการเปลี่ยนชื่อ พวกเขามี "fill_parent" ถูกเปลี่ยนเป็น "match_parent" สำหรับค่าพารามิเตอร์ของเค้าโครง ทั้งคู่เป็นสิ่งเดียวกันชี้ไปที่ค่าเดียวกัน ..
นักพัฒนา Android

18

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันมีสถานการณ์ที่คล้ายกันและทางออกของฉันคือ

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

จากนั้นคุณสามารถเล่นกับ "Drawable" การใช้ฟิลเตอร์สี ฯลฯ


6
ใช้งานได้เฉพาะถ้าภาพต้นฉบับมาจากแหล่งข้อมูล
Matt Huggins

สิ่งนี้ไม่แม้แต่จะตอบคำถามของ OP
Petro


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

การใช้ Android studio 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, spinner ... ฯลฯ และ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)

ตรวจสอบให้แน่ใจด้วยว่า imageview เป็นองค์ประกอบแรกภายใน RelativeLayout ดังนั้นมันจะทำหน้าที่เป็นพื้นหลัง


1
จริงๆแล้วมันไม่ควรเกินกว่าifประโยคหนึ่ง ดูคำตอบที่ถูกต้อง
Pijusn

-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 แต่มันตอบคำถามดังนั้นมันไม่ควรถูกลดระดับลงหากไม่มีคำอธิบาย เมื่อคุณบอกเด็กว่าอย่าทำอะไรโดยไม่บอกว่าทำไมพวกเขาถึงทำอย่างนั้น;)
Fabricio

11
ฉันไม่ต้องการออกจากหัวข้อ แต่นี่คือสาเหตุ: 1. Java เป็นภาษาที่พิมพ์แบบคงที่ - ใช้คอมไพเลอร์; 2. นี่เป็นเพียงคำสั่ง if ในการอำพราง (มันทำให้งงงวยตรรกะที่แท้จริง); 3. กำลังนำปืนใหญ่ออกมาเพื่อฆ่ายุง - รหัสนี้ใช้ปืนใหญ่ร้ายแรงเพื่อแก้ปัญหาเล็กน้อย หวังว่าจะปรับให้เหมาะสม
Błażej Czapp

ขอบคุณ @BlazejCzapp คุณพูดถูกฉันมีกรณีใช้ที่นี่ซึ่งจำเป็นต้องทำสิ่งต่าง ๆ เช่นรหัสด้านบน แต่ไม่ควรใช้หากมีวิธีที่เหมาะสมในการจัดการกับสิ่งนี้
Fabricio

2
นี่มันโง่ ... ไม่มีเหตุผลที่จะใช้การไตร่ตรองเพื่อบรรลุสิ่งนี้
Alex Lockwood

ใช่บอกคนที่ถามคำถามง่าย ๆ ว่า "ฉันควรใช้อะไรดี?" เริ่มปรับเปลี่ยนเวลาทำงาน
Petro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.