Android: Thay thế cho context.getDrawable ()


84

Tôi đã sử dụng context.getDrawable()như thế này trong dự án của mình:

Drawable greenProgressbar = context.getDrawable(R.drawable.custom_progressbargreen);

Nhưng Eclipse đang cho tôi một lỗi mà nó cần a Minimum API level of 21. Điều này có nghĩa là sau khi tìm kiếm nhanh trên google, APP của tôi sẽ chỉ có thể sử dụng được Android 5.0. Vì không phải tất cả các thiết bị đều sử dụng phiên bản android này nên tôi muốn có một giải pháp thay thế cho context.getDrawable().

Câu trả lời:


201

Phương pháp được chấp nhận trước đây đã không còn được dùng nữa, theo tài liệu SDK 22:

Trước android.os.Build.VERSION_CODES # JELLY_BEAN, hàm này sẽ không truy xuất chính xác mật độ cấu hình cuối cùng khi ID tài nguyên được chuyển vào đây là bí danh cho một tài nguyên có thể vẽ khác. Điều này có nghĩa là nếu cấu hình mật độ của tài nguyên bí danh khác với tài nguyên thực, thì mật độ của Drawable trả về sẽ không chính xác, dẫn đến tỷ lệ sai.

Như đã chỉ ra trong câu trả lời này, giải pháp tốt hơn sẽ là sử dụng ContextCompat : ContextCompat.getDrawable(context, R.drawable.***)


1
Tôi đã chấp nhận câu trả lời này ngay bây giờ vì nó có liên quan hơn :)
Bram

26

Hãy thử thêm một getResources()sau ngữ cảnh, như sau:

Drawable greenProgressbar = context.getResources().getDrawable(R.drawable.custom_progressbargreen);

nên làm việc.


4
Resources.getDrawable đã phản đối ủng hộ Context.getDrawable
Joe Bowbeer

12

Tôi đã gặp phải tình huống tương tự mà tôi muốn tham chiếu đến phương thức getDrawable () hiện không được dùng nữa.

những gì tôi đã sử dụng,

myButton.setImageDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.ic_btn_off));

Hy vọng điều này sẽ giúp bạn


9

Tôi đã có một vấn đề tương tự trước đây. Bạn đã thử làm như thế này chưa?

Drawable greenProgressbar = context.getResources().getDrawable(R.drawable.custom_progressbargreen);

Điều này không được dùng nữa.
Taslim Oseni

2

Thử đi:

AppCompatResources.getDrawable(context, R.drawable.*)

1

Bạn nên sử dụng "getDrawable (id, this.getTheme ())". Phương pháp này không bị phản đối cho đến bây giờ.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    view.setBackground(getResources().getDrawable(R.drawable.radioline,this.getTheme()));
} else {
   view.setBackground(getResources().getDrawable(R.drawable.radioline));
}

1

Tôi đồng ý sử dụng ContextCompact.getDrawable (Bối cảnh ngữ cảnh, int resID). Nó phù hợp với tôi và ứng dụng của tôi nhắm mục tiêu API 19.


1

Bạn cũng có thể thiết lập tài nguyên trực tiếp mà không cần làm việc với drawable (Kotlin):

btn.setImageResource(R.drawable.ic_XXX)

1

Giải pháp cho các lập trình viên Kotlin trông giống như:

val greenProgressbar = context!!.getDrawable(R.drawable.custom_progressbargreen)

hoặc (từ API 22)

val greenProgressbar = ContextCompat.getDrawable(R.drawable.custom_progressbargreen)
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.