Với API Android 22 mới getResources().getDrawable()
hiện không được chấp nhận. Bây giờ cách tiếp cận tốt nhất là chỉ sử dụng getDrawable()
.
Những gì đã thay đổi?
Resources#getDrawable(int)
và Resources#getColor(int)
đều không được chấp nhận.
Với API Android 22 mới getResources().getDrawable()
hiện không được chấp nhận. Bây giờ cách tiếp cận tốt nhất là chỉ sử dụng getDrawable()
.
Những gì đã thay đổi?
Resources#getDrawable(int)
và Resources#getColor(int)
đều không được chấp nhận.
Câu trả lời:
Bạn có một số tùy chọn để xử lý sự phản đối này theo cách đúng (và bằng chứng trong tương lai ), tùy thuộc vào loại bạn có thể rút được:
A) drawable với thuộc tính chủ đề
ContextCompat.getDrawable(getActivity(), R.drawable.name);
Bạn sẽ có được một Drawable theo kiểu như chủ đề Hoạt động của bạn hướng dẫn. Đây có lẽ là những gì bạn cần.
B) drawable không có thuộc tính chủ đề
ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);
Bạn sẽ có được drawable unstyled của bạn theo cách cũ. Hãy lưu ý: ResourcesCompat.getDrawable()
là không bị phản đối!
EXTRA) có thể vẽ với các thuộc tính chủ đề từ chủ đề khác
ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);
Bạn nên sử dụng mã sau đây từ thư viện hỗ trợ thay thế:
ContextCompat.getDrawable(context, R.drawable.***)
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);
}
Kể từ API 21, bạn nên sử dụng getDrawable(int, Theme)
phương thức thay vì getDrawable(int)
, vì nó cho phép bạn tìm nạp một đối tượng có thể vẽ được liên kết với ID tài nguyên cụ thể cho mật độ / chủ đề màn hình cụ thể. Gọi getDrawable(int)
phương thức không dùng nữa tương đương với gọi getDrawable(int, null)
.
getDrawable (int id)
phương pháp của Context
lớp. Điều này giống như getResources().getDrawable(id, getTheme());
và cũng sử dụng API mới.
getDrawable(int, Resources.Theme)
.
Thay thế dòng này:
getResources().getDrawable(R.drawable.your_drawable)
với ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)
BIÊN TẬP
ResourcesCompat
bây giờ cũng không được chấp nhận Nhưng bạn có thể sử dụng điều này:
ContextCompat.getDrawable(this, R.drawable.your_drawable)
(Đây this
là bối cảnh)
để biết thêm chi tiết theo liên kết này: ContextCompat
getResources().getDrawable()
đã bị phản đối ở cấp độ API 22. Bây giờ chúng ta phải thêm chủ đề:getDrawable (int id, tài nguyên.Theme theme) (Đã thêm vào API cấp 21)
Đây là một ví dụ:
myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
Đây là một ví dụ về cách xác nhận cho các phiên bản sau:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
} else {
myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage));
}
Build.VERSION_CODES.LOLLIPOP is API 21
Vì vậy, điều này không nên if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
hay if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)
? Đừng bận tâm. Từ bên dưới "Phương thức đã được thêm vào API 21 nhưng nó không bị phản đối cho đến API 22. :)"
Bạn có thể dùng
ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);
đó là công việc cho tôi
Chỉ là một ví dụ về cách tôi khắc phục sự cố trong một mảng để tải listView, hy vọng nó có ích.
mItems = new ArrayList<ListViewItem>();
// Resources resources = getResources();
// mItems.add(new ListViewItem(resources.getDrawable(R.drawable.az_lgo), getString(R.string.st_az), getString(R.string.all_nums)));
// mItems.add(new ListViewItem(resources.getDrawable(R.drawable.ca_lgo), getString(R.string.st_ca), getString(R.string.all_nums)));
// mItems.add(new ListViewItem(resources.getDrawable(R.drawable.co_lgo), getString(R.string.st_co), getString(R.string.all_nums)));
mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.az_lgo, null), getString(R.string.st_az), getString(R.string.all_nums)));
mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.ca_lgo, null), getString(R.string.st_ca), getString(R.string.all_nums)));
mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.co_lgo, null), getString(R.string.st_co), getString(R.string.all_nums)));
Thử cái này:
public static List<ProductActivity> getCatalog(Resources res){
if(catalog == null) {
catalog.add(new Product("Dead or Alive", res
.getDrawable(R.drawable.product_salmon),
"Dead or Alive by Tom Clancy with Grant Blackwood", 29.99));
catalog.add(new Product("Switch", res
.getDrawable(R.drawable.switchbook),
"Switch by Chip Heath and Dan Heath", 24.99));
catalog.add(new Product("Watchmen", res
.getDrawable(R.drawable.watchmen),
"Watchmen by Alan Moore and Dave Gibbons", 14.99));
}
}
Nếu bạn đang nhắm mục tiêu SDK> 21 (kẹo mút hoặc 5.0), hãy sử dụng
context.getDrawable(R.drawable.your_drawable_name)
getDrawable (int drawable) không được dùng ở cấp API 22. Để tham khảo xem liên kết này .
Bây giờ để giải quyết vấn đề này, chúng ta phải vượt qua một trình xây dựng mới cùng với id như: -
getDrawable(int id, Resources.Theme theme)
Đối với giải pháp Làm như thế này: -
Trong Java: -
ContextCompat.getDrawable(getActivity(), R.drawable.name);
hoặc là
imgProfile.setImageDrawable(getResources().getDrawable(R.drawable.img_prof, getApplicationContext().getTheme()));
Trong Kotlin: -
rel_week.background=ContextCompat.getDrawable(this.requireContext(), R.color.colorWhite)
hoặc là
rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)
Hy vọng điều này sẽ giúp bạn. Cảm ơn.
en api cấp 14
marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));
Đối với một số người vẫn giải quyết được vấn đề này ngay cả sau khi áp dụng đề xuất của chủ đề này (tôi đã từng là một người như vậy), hãy thêm dòng này vào lớp Ứng dụng của bạn, phương thức onCreate ()
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
Như được đề xuất ở đây và ở đây đôi khi điều này là bắt buộc để truy cập vectơ từ các tài nguyên, đặc biệt là khi bạn đang xử lý các mục menu, v.v.
Trong Kotlin, bạn có thể sử dụng tiện ích mở rộng
fun Context.getMyDrawable(id : Int) : Drawable?{
return ContextCompat.getDrawable(this, id)
}
sau đó sử dụng như
context.getMyDrawable(R.drawable.my_icon)
Build.VERSION_CODES.LOLLIPOP nên được thay đổi thành BuildVersionCodes.Leets tức là:
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) {
this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder, Context.Theme);
} else {
this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder);
}
BuildVersionCodes
một lớp học cụ thể cho Xamarin?
getDrawable (int id)
của lớpResources
bị phản đối. Bây giờ bạn nên sử dụng phương thứcgetDrawable (int id, Resources.Theme theme)
với tham số chủ đề mới.