2011-01-27 33 views
228

Tôi có hình ảnh res/drawable/test.png (R.drawable.test).
Tôi muốn chuyển hình ảnh này đến một hàm chấp nhận Drawable.
(ví dụ: mButton.setCompoundDrawables())Cách tạo Bản vẽ từ tài nguyên

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

Trả lời

492

Hoạt động của bạn phải có phương thức getResources. Đừng:

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

Bạn có cần thêm thứ gì đó khác vào tệp kê khai không? Tôi đã tạo một dự án trống chỉ với dòng mã này trong onCreate và tôi nhận được Tài nguyên $ NotFoundException. Dự án đi kèm với icon.png trong bản đồ hdpi, ldpi và mdpi. – Vincent

+1

Nếu bạn muốn điều này bên ngoài một lớp Activity, bạn sẽ phải tìm một số cách khác để đến được Context nơi getResources() sống; [câu trả lời này đề xuất chuyển nó vào hàm tạo] (http://stackoverflow.com/a/6214567/404960) – rymo

+34

Kể từ phiên bản API 21, phương pháp này không được chấp nhận và bạn nên được thay thế bằng: Drawable drawable = ResourcesCompat.getDrawable (getResources(), trang.getImageId(), null); – Boren

0

Nếu bạn đang cố gắng để có được những drawable từ quan điểm mà hình ảnh được thiết lập như là,

ivshowing.setBackgroundResource(R.drawable.one); 

thì drawable sẽ trở lại giá trị chỉ null với đoạn mã sau ...

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

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

ivshowing.setImageResource(R.drawable.one); 

chỉ khi đó chúng tôi mới có thể chuyển đổi chính xác.

20

Phương pháp getDrawable (int id) được 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 trên 21

Mã sẽ 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); 
} 
+0

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 khi API 21. – ChrisStillwell

98

Mã này không còn được dùng nữa.

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

Sử dụng bản dịch này.

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

Lưu ý rằng điều này sẽ áp dụng chủ đề từ ngữ cảnh đã cho. Nếu bạn muốn đảm bảo không có theme 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 cá thể Theme tùy chọn). – vaughandroid

9

Tôi chỉ muốn 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 getResources() khi sử dụng phương pháp này.

này tương đương với làm một cái gì đó giống 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]); 
} 

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

Các vấn đề liên quan