การเรียก setCompoundDrawables () ไม่แสดง Compound Drawable


323

หลังจากที่ฉันเรียกsetCompoundDrawablesเมธอดแล้ว Drawable ผสมจะไม่ปรากฏขึ้น ..

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn.setCompoundDrawables(myDrawable, null, null, null);

ความคิดใด ๆ


9
ดังที่ระบุไว้ในคำตอบด้านล่างความแตกต่างของวิธีการที่มีชื่อ(..)WithIntrinsicBoundsจะต้องมีการเรียก ในหมายเหตุด้านpaddingสำหรับการจับสลาก Compound ต้องตั้งค่าหลังจากการโทรนี้เพื่อให้เกิดผลกระทบ
Dr1Ku

6
เอกสาร says: Drawables ต้องมีอยู่แล้วได้setBounds(Rect)เรียกว่า

สวัสดี hunterp เพิ่งพบคุณที่ร้านกาแฟ (Angel) ตอนนี้ฉันรู้ว่าคุณรู้ว่า Android Drawables คืออะไร (และบางทีคุณอาจโดนหน่วยความจำหมดข้อผิดพลาดเมื่อทำงานกับหลาย ๆ คน) ฉันสามารถบอกคุณเกี่ยวกับ โครงการที่ผมเคยร่วมมือมีการจัดการกับปัญหานี้ตรวจสอบgithub.com/JakeWharton/DiskLruCache (ซึ่งผมร่วมมือที่จะทำให้หุ่นยนต์ที่เป็นมิตรมากขึ้น) ซึ่งถูกใช้โดยปิกัสโซ ( github.com/square/picasso )
Gubatron

@ Dr1Ku ที่จริงฉันมีมาก่อนและใช้งานได้อยู่แล้ว
Sotti

คำตอบ:


629

setCompoundDrawablesWithIntrinsicBoundsฉันจำเป็นต้องใช้


7
ต้องการ api 17 ดังนั้น Drawable.setBounds () อาจจะดีกว่า
user1324936

6
ขอบคุณมาก .. สิ่งนี้เหมาะกับฉัน .. ฉันขอทราบความแตกต่างระหว่างสองสิ่งนี้ได้ไหม
AndEngine

1
@ user1324936 เวอร์ชัน 'ญาติ' ต้องใช้ API 17 และอื่น ๆ สามารถใช้กับเวอร์ชันก่อนหน้า
milosmns

11
@ user1324936 setCompoundDrawablesWithIntrinsicBounds ถูกเพิ่มในAPI ระดับ 3
Greg Ennis

ฉันใช้ setCompoundDrawableRelativeWithIntrinsicBounds <- อันนี้ถูกเพิ่มใน API 17 ระวังของ intellisense
นีออนสี

69

ใช้สิ่งนี้ (ฉันทดสอบ) มันใช้งานได้ดี

Drawable image = context.getResources().getDrawable( R.drawable.ic_action );
int h = image.getIntrinsicHeight(); 
int w = image.getIntrinsicWidth();   
image.setBounds( 0, 0, w, h );
button.setCompoundDrawables( image, null, null, null );

1
สิ่งนี้มีประโยชน์เมื่อกำหนดเป้าหมาย API ที่ต่ำกว่า 17 เนื่องจากEditText#setCompoundDrawablesWithIntrinsicBoundsต้องใช้อย่างน้อย API 17
Krøllebølle

6
คุณสามารถให้แหล่งข้อมูลสำหรับสิ่งนั้นได้หรือไม่? เอกสารทั้งหมดที่ผมเคยเห็นบ่งชี้นี้ได้รับมีตั้งแต่ 1
kurifu

48

ภาพว่างเปล่าเนื่องจากไม่ได้ระบุขอบเขต คุณอาจใช้setCompoundDrawables()แต่ก่อนที่คุณควรระบุขอบเขตของรูปภาพโดยใช้Drawable.setBounds()วิธีการ


1
คำตอบที่ดีที่สุดเพราะคุณให้เหตุผลว่าทำไม setBounds จึงสำคัญ
Andy

@Andy เกลียดคำตอบยอดนิยมเหล่านี้ด้วย 800 คะแนนโหวตที่เพิ่งคัดลอกโค้ดหนึ่งบรรทัดโดยไม่มีคำใด ๆ
Big_Chair

44

ตัวอย่างตั้งไว้ที่ด้านบน:

view.setCompoundDrawablesWithIntrinsicBounds(
    null,
    getResources().getDrawable(R.drawable.some_img),
    null,
    null
);

ลำดับอาร์กิวเมนต์: (ซ้าย, บน, ขวา, ล่าง)


1
นี่ควรเป็นคำตอบที่ยอมรับในกรณีของฉันโดยใช้ปุ่ม และมันทำงานได้ตามที่คาดไว้ !!! มันยังเข้ากันได้ย้อนหลัง
mochadwi

22

ง่ายขึ้นอีกเล็กน้อย:

Drawable image = context.getResources().getDrawable(R.drawable.ic_action );
image.setBounds( 0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight() );
button.setCompoundDrawables( image, null, null, null );

10

มันเลิกใช้แล้วใน API 22

รหัสนี้มีประโยชน์สำหรับฉัน:

Drawable drawable = ResourcesCompat.getDrawable(getResources(),R.drawable.wen, null);
drawable.setBounds(0, 0, drawable.getMinimumWidth(),
drawable.getMinimumHeight());
tv.setCompoundDrawables(drawable, null, null, null);

3

ใน Kotlin:

1) ชุดdrawable:

val drawable = ContextCompat.getDrawable(context!!,R.drawable.ic_image)?.apply {
    setBounds(0, 0, intrinsicWidth, intrinsicHeight)
}

หรือ

val drawable = ResourcesCompat.getDrawable(resources, R.drawable.ic_image, null)?.apply {
    setBounds(0, 0, minimumWidth, minimumHeight)
}

2) ชุดTextView:

textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)

หรือ

button.setCompoundDrawables(null, drawable, null, null)

สำหรับ Textview setCompoundDrawablesWithIntrinsicBoundsจะใช้ได้ ..
Akash Bisariya


1

ตัวอย่างกับ Kotlin:

    val myView = layoutInflater.inflate(R.layout.my_view, null) as TextView
    myView.setCompoundDrawablesWithIntrinsicBounds(0, myDrawable, 0, 0)

0

รูปภาพจะไม่ปรากฏเนื่องจากคุณไม่ได้ระบุขอบเขตดังนั้นคุณจึงมี 2 ตัวเลือกที่นี่

วิธีที่ 1

ใช้setCompoundDrawablesWithIntrinsicBoundsวิธีการที่แสดงด้านล่าง

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn. setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null);

วิธีที่ 2

คุณสามารถใช้ขอบเขตกับ drawable ก่อนนำไปใช้กับ TextView ดังที่แสดงด้านล่าง

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
myDrawable.setBounds( 0, 0, myDrawable.getIntrinsicWidth(), myDrawable.getIntrinsicHeight());
btn.setCompoundDrawables(myDrawable, null, null, null);

แค่นั้นแหละ.

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