Gọi setCompoundDrawables () không hiển thị Compound Drawable


323

Sau khi tôi gọi setCompoundDrawablesphương thức, hợp chất Drawable không được hiển thị ..

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

Có suy nghĩ gì không?


9
Như đã nêu trong các câu trả lời dưới đây, biến thể của phương thức có tên (..)WithIntrinsicBoundscần được gọi. Bên cạnh đó, paddingđối với Hợp chất có thể rút được phải được đặt sau lệnh gọi này để gây hiệu ứng
Dr1Ku

6
Các tài liệu cho biết: Các Drawables phải đã đã setBounds(Rect)gọi.

xin chào hunterp, vừa gặp bạn tại quán cà phê (Angel), bây giờ tôi biết bạn biết Android Drawables là gì (và có lẽ bạn đã gặp phải lỗi bộ nhớ khi làm việc với nhiều người trong số họ), tôi có thể nói với bạn về một số các dự án mà tôi đã hợp tác phải giải quyết vấn đề này, hãy xem github.com/JakeWharton/DiskLruCache (mà tôi đã hợp tác để làm cho Android trở nên thân thiện hơn) được Picasso sử dụng ( github.com/sapes/picasso )
Gubatron

@ Dr1Ku Thật ra tôi có nó trước đây và dù sao cũng hoạt động.
Sotti

Câu trả lời:


629

Tôi cần phải được sử dụng setCompoundDrawablesWithIntrinsicBounds.


7
cần api 17 để Drawable.setBound () có thể tốt hơn
user1324936

6
thankyou rất nhiều .. điều này làm việc cho tôi .. tôi có thể biết sự khác biệt giữa hai điều này không?
AndEngine

1
@ user1324936 Phiên bản 'tương đối' yêu cầu API 17, các phiên bản khác có thể được sử dụng với các phiên bản trước
milosmns

11
@ user1324936 setCompoundDrawablesWithIntrinsicBound đã được thêm vào API Cấp 3
Greg Enni

Tôi đã sử dụng setCompoundDrawableRelativeWithIntrinsicBound <- cái này đã được thêm vào API 17. Hãy cẩn thận với intellisense.
Chiến tranh neon

69

Sử dụng này (tôi đã thử nghiệm). Nó hoạt động tốt

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
Điều này hữu ích khi nhắm mục tiêu API thấp hơn 17, vì EditText#setCompoundDrawablesWithIntrinsicBoundsyêu cầu ít nhất API 17.
Krøllebølle

6
Bạn có thể cung cấp một nguồn cho điều đó? Tất cả các tài liệu tôi đã thấy cho thấy điều này đã có sẵn kể từ API 1 .
Kurifu

48

Hình ảnh trống vì nó không có giới hạn được chỉ định. Bạn có thể sử dụng setCompoundDrawables()nhưng trước khi xác định giới hạn hình ảnh, sử dụng Drawable.setBounds()phương thức


1
Câu trả lời tốt nhất bởi vì bạn thực sự cung cấp lý do là tại sao setBound lại quan trọng.
Andy

@Andy Chính xác, ghét những câu trả lời hàng đầu này với 800 phiếu chỉ sao chép dán một dòng mã mà không có bất kỳ từ nào
Big_Chair

44

Ví dụ được đặt lên hàng đầu:

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

thứ tự đối số: (trái, trên, phải, dưới)


1
đây sẽ là câu trả lời được chấp nhận, trong trường hợp của tôi sử dụng nút. và nó hoạt động như mong đợi !!! Nó cũng tương thích ngược.
mochadwi 17/03/19

22

Một chút đơn giản nữa:

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

10

Nó không được dùng trong API 22.

Mã này hữu ích cho tôi:

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

3

Trong Kotlin:

1) Đặt drawable:

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

hoặc là

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

2) Đặt TextView:

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

hoặc là

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

Đối với Textview setCompoundDrawablesWithIntrinsicBoundssẽ hoạt động ..
Akash Bisariya


1

Ví dụ với Kotlin:

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

0

Hình ảnh không được hiển thị vì bạn không chỉ định giới hạn, vì vậy bạn có 2 tùy chọn ở đây.

Phương pháp 1

Sử dụng setCompoundDrawablesWithIntrinsicBoundsphương pháp, như hình dưới đây

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

Phương pháp 2

Bạn có thể áp dụng giới hạn cho drawable trước khi áp dụng cho TextView, như hiển thị bên dưới

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

Đó là nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.