Cách tạo Drawable từ tài nguyên


283

Tôi có một hình ảnh res/drawable/test.png(R.drawable.test).
Tôi muốn chuyển hình ảnh này đến một chức năng chấp nhận Drawable, ví dụ mButton.setCompoundDrawables().

Vậy làm thế nào tôi có thể chuyển đổi một tài nguyên hình ảnh thành một Drawable?

Câu trả lời:


566

Hoạt động của bạn nên có phương thức getResource. Làm:

Drawable myIcon = getResources().getDrawable( R.drawable.icon );

2
Nếu bạn tình cờ muốn điều này bên ngoài lớp Activity, bạn sẽ phải tìm một số cách khác để tiếp cận Bối cảnh nơi getResource () sống; câu trả lời này khuyên bạn nên chuyển nó vào hàm tạo
rymo

50
Kể từ API phiên bản 21, phương thức này không được dùng nữa và bạn nên được thay thế bằng: Drawable drawable = ResourcesCompat.getDrawable (getResource (), page.getImageId (), null);
Boren

3
@Boren giống như sử dụng ContextCompat.getDrawable (this, R.drawable.icon);?
Zach

2
Không có gợi ý nào ở trên có vẻ hiệu quả nếu R.drawable.icon là một Vector có thể vẽ được.
FractalBob

4
KHÔNG SỬ DỤNG NÀY NẾU BẠN ĐANG SỬ DỤNG BẢN VOR. Thay vào đó, hãy sử dụng AppCompatResource.getDrawable (bối cảnh, R.drawable.icon).
Dhaval Patel

136

Mã này không được chấp nhận:

Drawable drawable = getResources().getDrawable( R.drawable.icon );

Sử dụng cái này thay thế:

Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.icon);

11
Hãy lưu ý rằng điều này sẽ áp dụng chủ đề từ bối cảnh nhất định. Nếu bạn muốn đảm bảo không có chủ đề nào được sử dụng, bạn có thể sử dụng ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null);(trong đó param thứ 3 là một thể hiện Theme tùy chọn).
vaughandroid

23

Các getDrawable (int id)phương pháp khấu hao như các API 22.

Thay vào đó, bạn nên sử dụng getDrawable (int id, Resources.Theme theme)cho API 21+

Mã sẽ trông giống như thế này.

Drawable myDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    myDrawable = context.getResources().getDrawable(id, context.getTheme());
} else {
    myDrawable = context.getResources().getDrawable(id);
}

Tại sao không vượt qua null cho mỗi api? Plus: Bạn có chắc rằng null là lựa chọn tốt nhất?
jonathanrz

1
Chủ đề getDrawable (int id, Resources.Theme) không xuất hiện cho đến API 21.
Chris Stillwell

hoặcgetResources().getDrawable(R.drawable.ic_warning_80dp, context?.theme)
Simon Featherstone

13

Tôi chỉ muốn nói thêm rằng nếu bạn nhận được thông báo "không dùng nữa" khi sử dụng getDrawable (...), bạn nên sử dụng phương thức sau từ thư viện hỗ trợ.

ContextCompat.getDrawable(getContext(),R.drawable.[name])

Bạn không phải sử dụng getResource () khi sử dụng phương thức này.

Điều này tương đương với việc làm một cái gì đó như

Drawable mDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    mDrawable = ContextCompat.getDrawable(getContext(),R.drawable.[name]);
} else {
    mDrawable = getResources().getDrawable(R.id.[name]);
}

Điều này hoạt động trên cả phiên bản trước và sau Lollipop.


4

Nhận Drawable từ tài nguyên vectơ không phân biệt, cho dù vectơ của nó hay không:

AppCompatResources.getDrawable(context, R.drawable.icon);

Lưu ý:
ContextCompat.getDrawable(context, R.drawable.icon); sẽ sản xuất android.content.res.Resources$NotFoundExceptioncho tài nguyên vector.


3

Nếu bạn đang cố gắng để có được drawable từ chế độ xem hình ảnh được đặt là,

ivshowing.setBackgroundResource(R.drawable.one);

sau đó drawable sẽ chỉ trả về giá trị null với mã sau ...

   Drawable drawable = (Drawable) ivshowing.getDrawable();

Vì vậy, tốt hơn là đặt hình ảnh với mã sau đây, nếu bạn muốn truy xuất drawable từ một chế độ xem cụ thể.

 ivshowing.setImageResource(R.drawable.one);

chỉ sau đó drawable chúng tôi sẽ chuyển đổi chính xác.


1

Nếu bạn đang thừa hưởng từ một mảnh, bạn có thể làm:

Drawable drawable = getActivity().getDrawable(R.drawable.icon)

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.