Làm thế nào để bạn có được một đối tượng Drawable từ id tài nguyên trong gói Android?


156

Tôi cần phải có một đối tượng Drawable để hiển thị trên nút hình ảnh. Có cách nào để sử dụng mã bên dưới (hoặc một cái gì đó giống như vậy) để lấy một đối tượng từ gói android.R.drawable. * Không?

ví dụ: nếu drawableId là android.R.drawable.ic_delete

mContext.getResources().getDrawable(drawableId)

Câu trả lời:


222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);

Tôi cũng thấy rằng sử dụng bối cảnh ứng dụng dường như hoạt động, cảm ơn.
Blaskovicz

20
Kể từ API 22. getDrawable(int id)không được dùng nữa. Sử dụng getDrawable(int id, Resources.Theme theme)thay thế. Phương pháp getTheme()này sẽ hữu ích.
Isaac Zais

1
Tôi có một nghi ngờ nhỏ. Trong mã này "Phương thức getDrawable (int) từ loại Tài nguyên không được dùng nữa". Theo một câu trả lời SO 1. Có sai không khi sử dụng các phương thức hoặc các lớp không dùng trong Java? Từ định nghĩa của deprecated: "Một phần tử chương trình được chú thích @Deprecated là một phần tử mà các lập trình viên không khuyến khích sử dụng, thường là vì nó nguy hiểm hoặc vì một sự thay thế tốt hơn tồn tại." Điều gì là thay thế tốt hơn cho điều này.
Kẻ giết người

107

Tính đến API 21 , bạn nên sử dụng getDrawable(int, Theme)phương pháp thay vì getDrawable(int), vì nó cho phép bạn lấy một drawableđối tượng gắn liền với một đặc biệt resource IDcho GIVEN screen density/theme. Gọi deprecated getDrawable(int)phương thức tương đương với gọi getDrawable(int, null).

Bạn nên sử dụng mã sau đây từ thư viện hỗ trợ thay thế:

ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

Sử dụng phương pháp này tương đương với việc gọi:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

context.getDrawable(id);dường như tương đương vớiresources.getDrawable(id, context.getTheme());
ErickBergmann

Điều này có thể được thực hiện trong một dòng nếu bạn có thư viện hỗ trợ:ResourcesCompat.getDrawable(resources, id, context.getTheme());
k2col

9

Kể từ API 21, bạn cũng có thể sử dụng:

   ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);

Thay vì ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)


2
Bạn có thể vui lòng cung cấp giải thích thêm cho sự lựa chọn
Nyandika

3

cách tốt nhất là

 button.setBackgroundResource(android.R.drawable.ic_delete);

HOẶC cái này cho Drawable bên trái và một cái gì đó tương tự cho bên phải, v.v.

int imgResource = R.drawable.left_img;
button.setCompoundDrawablesWithIntrinsicBounds(imgResource, 0, 0, 0);

getResources().getDrawable() bây giờ không được dùng nữa


0

Từ API 21 getDrawable(int id)không được chấp nhận. Vì vậy, bây giờ bạn cần sử dụng

ResourcesCompat.getDrawable(context.getResources(), R.drawable.img_user, null)

Nhưng cách tốt nhất để làm là: Bạn nên tạo một lớp chung để có thể vẽ và màu sắc bởi vì nếu có bất kỳ điều gì thay đổi hoặc không dùng nữa trong tương lai thì bạn không cần phải thay đổi ở mọi nơi trong dự án của mình. Bạn chỉ cần thay đổi trong phương pháp này

object ResourceUtils {
    fun getColor(context: Context, color: Int): Int {
        return ResourcesCompat.getColor(context.getResources(), color, null)
    }

    fun getDrawable(context: Context, drawable: Int): Drawable? {
        return ResourcesCompat.getDrawable(context.getResources(), drawable, null)
    }
}

sử dụng phương pháp này như:

Drawable img=ResourceUtils.getDrawable(context, R.drawable.img_user)
image.setImageDrawable(img);

0

Theo một giải pháp cho các lập trình viên Kotlin (từ API 22)

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
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.