วิธีตั้งค่าพื้นหลัง drawable โดยทางโปรแกรมใน Android


289

วิธีตั้งค่าพื้นหลัง:

RelativeLayout layout =(RelativeLayout)findViewById(R.id.background);
layout.setBackgroundResource(R.drawable.ready);

เป็นวิธีที่ดีที่สุดที่จะทำ?


2
ขอบคุณ! คำถามและคำตอบที่เป็นประโยชน์ทั้งหมดของคุณช่วยให้ฉันตั้งทรัพยากรพื้นหลังของปุ่มภาพภายในวิดเจ็ต นี่เป็นตัวอย่างรหัสในกรณีที่มีคนสนใจ:remoteViews.setInt(R.id.btn_start,"setBackgroundResource", R.drawable.ic_button_start);
แซม

1
โซลูชัน Kotlin สำหรับผู้ที่อาจต้องการ: stackoverflow.com/a/54495750/6247186
Hamed Jaliliani

คำตอบ:


490

layout.setBackgroundResource(R.drawable.ready);ถูกต้อง.
อีกวิธีหนึ่งในการบรรลุเป้าหมายคือใช้สิ่งต่อไปนี้:

final int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    layout.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.ready) );
} else {
    layout.setBackground(ContextCompat.getDrawable(context, R.drawable.ready));
}

แต่ฉันคิดว่าปัญหาเกิดขึ้นเพราะคุณกำลังพยายามโหลดภาพขนาดใหญ่
นี่คือวิธีการสอนที่ดีในการโหลดบิตแมปขนาดใหญ่

อัปเดต:
เลิกใช้ getDrawable (int) ในระดับ API 22


getDrawable(int )ตอนนี้เลิกใช้ในระดับ API 22 คุณควรใช้รหัสต่อไปนี้จากไลบรารีสนับสนุนแทน:

ContextCompat.getDrawable(context, R.drawable.ready)

ถ้าคุณอ้างถึงซอร์สโค้ดของContextCompat.getDrawableมันให้อะไรแบบนี้:

/**
 * Return a drawable object associated with a particular resource ID.
 * <p>
 * Starting in {@link android.os.Build.VERSION_CODES#LOLLIPOP}, the returned
 * drawable will be styled for the specified Context's theme.
 *
 * @param id The desired resource identifier, as generated by the aapt tool.
 *            This integer encodes the package, type, and resource entry.
 *            The value 0 is an invalid identifier.
 * @return Drawable An object that can be used to draw this resource.
 */
public static final Drawable getDrawable(Context context, int id) {
    final int version = Build.VERSION.SDK_INT;
    if (version >= 21) {
        return ContextCompatApi21.getDrawable(context, id);
    } else {
        return context.getResources().getDrawable(id);
    }
}

รายละเอียดเพิ่มเติมเกี่ยวกับContextCompat

ในฐานะของ API 22 คุณควรใช้getDrawable(int, Theme)วิธีการแทน getDrawable (int)

UPDATE:
หากคุณใช้ไลบรารีสนับสนุน v4 ข้อมูลต่อไปนี้จะเพียงพอสำหรับทุกรุ่น

ContextCompat.getDrawable(context, R.drawable.ready)

คุณจะต้องเพิ่มสิ่งต่อไปนี้ในแอป build.gradle ของคุณ

compile 'com.android.support:support-v4:23.0.0' # or any version above

หรือใช้ ResourceCompat ใน API ใด ๆ ดังต่อไปนี้:

import android.support.v4.content.res.ResourcesCompat;
ResourcesCompat.getDrawable(getResources(), R.drawable.name_of_drawable, null);

3
'getDrawable (int)' เลิกใช้แล้ว
S.M_Emamian

สวัสดีฉันกำลังพยายามทำงานเฉพาะเมื่อภาพพื้นหลังของปุ่มรูปภาพเป็นทรัพยากรที่สามารถวาดได้ ฉันจะเปรียบเทียบได้อย่างไร ... ฉันได้ลองแล้วif(buttonBackground.equals(R.drawable.myDrawable))ว่าDrawable buttonBackground = myButton.getBackground();ฉันได้รับข้อผิดพลาดนี้ที่ไหน
Ruchir Baronia

คุณจะต้องmyActivity.getTheme()ใช้วิธีการเวอร์ชันล่าสุดแทนพารามิเตอร์ Null:myView.setBackground( getResources().getDrawable(R.drawable.my_background, activity.getTheme()));
Zon

หรือคุณสามารถใช้AppCompatResources.getDrawable(this.getContext(), resId)แทน Google ได้นำไปใช้ในAppCompat*วิดเจ็ต / มุมมองเช่น:android.support.v7.widget.AppCompatCheckBox
mochadwi

108

ลองสิ่งนี้:

layout.setBackground(ContextCompat.getDrawable(context, R.drawable.ready));

และสำหรับ API 16 <:

layout.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.ready));

2
แต่นี่คือสิ่งเดียวกันอาหมัด :)
โมฮัมหมัด Ersan

4
อาตกลงแล้วฉันจะตอบ Lazy Ninjas
Ahmad

39
getResources().getDrawable()คุณไม่จำเป็นต้อง รหัสที่ถูกต้องนั้นlayout.setBackgroundResource(R.drawable.ready);เหมือนกับ OP ที่ใช้ ปัญหาที่นี่มาจากขนาดของบิตแมป
BVB

1
setBackground เป็นระดับ API 16 ขึ้นไปเท่านั้น
Erwan

17
RelativeLayout relativeLayout;  //declare this globally

ตอนนี้ภายในฟังก์ชั่นใด ๆ เช่น onCreate, onResume

relativeLayout = new RelativeLayout(this);  
relativeLayout.setBackgroundResource(R.drawable.view); //or whatever your image is
setContentView(relativeLayout); //you might be forgetting this

9

นอกจากนี้คุณยังสามารถกำหนดพื้นหลังของภาพใด ๆ :

View v;
Drawable image=(Drawable)getResources().getDrawable(R.drawable.img);
(ImageView)v.setBackground(image);

นี้แก้ปัญหาของฉัน แต่ฉันต้องใช้(.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)รหัสด้านใน
Armando Marques Sobrinho

1
นี่เลิกใช้แล้วตอนนี้
user7856586

4

ฉันใช้ minSdkVersion 16 และ targetSdkVersion 23
ต่อไปนี้ใช้งานได้สำหรับฉันมันใช้

ContextCompat.getDrawable(context, R.drawable.drawable);

แทนที่จะใช้:

layout.setBackgroundResource(R.drawable.ready);

ค่อนข้างใช้:

layout.setBackground(ContextCompat.getDrawable(this, R.drawable.ready));

getActivity()thisถูกนำมาใช้ในส่วนถ้าโทรมาจากการใช้งานกิจกรรม


2

หากพื้นหลังของคุณอยู่ในโฟลเดอร์ drawable ในตอนนี้ให้ลองย้ายรูปภาพจากโฟลเดอร์ drawable ไปเป็น drawable-nodpi ในโครงการของคุณ มันใช้งานได้สำหรับฉันดูเหมือนว่าภาพอื่นจะได้รับการช่วยเหลือจากพวกเขา ..


5
ถ้าคุณยังไม่มีสำเนาของรูปภาพที่คุณต้องใช้ในโครงการในคุณภาพระดับ HD ทำไม Android ให้ rescale พวกเขาเพื่อคุณภาพเส็งเคร็งโดยใช้โฟลเดอร์ drawable ปกติ และแม้แต่คำถามก็เก่าถ้ามันยังปรากฏใน Google มากกว่าการโพสต์สิ่งใหม่ในมันก็โอเค
Jordy

1

ใช้butterknifeเพื่อโยงรีซอร์ส drawable เข้ากับตัวแปรโดยเพิ่มสิ่งนี้ไว้ที่ด้านบนสุดของคลาส (ก่อนหน้าเมธอดใด ๆ )

@Bind(R.id.some_layout)
RelativeLayout layout;
@BindDrawable(R.drawable.some_drawable)
Drawable background;

จากนั้นภายในหนึ่งในวิธีการของคุณเพิ่ม

layout.setBackground(background);

นั่นคือทั้งหมดที่คุณต้องการ


1
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
     layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.ready));
else if(android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1)
     layout.setBackground(getResources().getDrawable(R.drawable.ready));
else
     layout.setBackground(ContextCompat.getDrawable(this, R.drawable.ready));





-1

ภายในแอป / res / your_xml_layout_file .xml

  1. กำหนดชื่อให้กับเลย์เอาต์หลักของคุณ
  2. ไปที่ MainActivity ของคุณและค้นหา RelativeLayout ของคุณโดยเรียกใช้ findViewById (R.id. "given_name")
  3. ใช้เค้าโครงเป็นวัตถุแบบคลาสสิกโดยเรียกเมธอด setBackgroundColor ()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.