Các Resources.getColor(int id)
phương pháp đã bị phản đối.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Tôi nên làm gì?
Các Resources.getColor(int id)
phương pháp đã bị phản đối.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Tôi nên làm gì?
Câu trả lời:
Bắt đầu từ Thư viện hỗ trợ Android 23,
một phương thức getColor () mới đã được thêm vào ContextCompat
.
Mô tả của nó từ JavaDoc chính thức:
Trả về màu được liên kết với ID tài nguyên cụ thể
Bắt đầu bằng M, màu được trả về sẽ được tạo kiểu cho chủ đề của Ngữ cảnh được chỉ định.
Vì vậy, chỉ cần gọi :
ContextCompat.getColor(context, R.color.your_color);
Bạn có thể kiểm tra ContextCompat.getColor()
mã nguồn trên GitHub .
tl; dr:
ContextCompat.getColor(context, R.color.my_color)
Giải trình:
Bạn sẽ cần sử dụng ContextCompat.getColor () , một phần của Thư viện V4 hỗ trợ (nó sẽ hoạt động cho tất cả các API trước đó).
ContextCompat.getColor(context, R.color.my_color)
Nếu bạn chưa sử dụng Thư viện hỗ trợ, bạn sẽ cần thêm dòng sau vào dependencies
mảng bên trong ứng dụng của mình build.gradle
(lưu ý: tùy chọn nếu bạn đã sử dụng thư viện appcompat (V7) ):
compile 'com.android.support:support-v4:23.0.0' # or any version above
Nếu bạn quan tâm đến các chủ đề, tài liệu chỉ định rằng:
Bắt đầu bằng M, màu được trả về sẽ được tạo kiểu cho chủ đề Ngữ cảnh được chỉ định
M
, màu được trả về sẽ được tạo kiểu cho chủ đề Ngữ cảnh được chỉ định. "
ContextCompat
lớp đến từ SupportV4. AppcompatV7 cũng hoạt động vì nó phụ thuộc vào SupportV4. Như họ nói trên tài liệu Thư viện hỗ trợ , This library depends on the v4 Support Library. If you are using Ant or Eclipse, make sure you include the v4 Support Library as part of this library's classpath.
. Vì vậy, nó có ý nghĩa không đưa AppcompatV7
vào câu trả lời.
Tôi không muốn bao gồm thư viện Hỗ trợ chỉ dành cho getColor , vì vậy tôi đang sử dụng một cái gì đó như
public static int getColorWrapper(Context context, int id) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return context.getColor(id);
} else {
//noinspection deprecation
return context.getResources().getColor(id);
}
}
Tôi đoán mã sẽ hoạt động tốt và không getColor
thể biến mất khỏi API <23.
Và đây là những gì tôi đang sử dụng trong Kotlin:
/**
* Returns a color associated with a particular resource ID.
*
* Wrapper around the deprecated [Resources.getColor][android.content.res.Resources.getColor].
*/
@Suppress("DEPRECATION")
@ColorInt
fun getColorHelper(context: Context, @ColorRes id: Int) =
if (Build.VERSION.SDK_INT >= 23) context.getColor(id) else context.resources.getColor(id);
Trong Android Marshmallow, nhiều phương thức không được dùng nữa.
Ví dụ, để có được màu sử dụng
ContextCompat.getColor(context, R.color.color_name);
Ngoài ra để có được sử dụng drawable
ContextCompat.getDrawable(context, R.drawable.drawble_name);
Đối với tất cả người dùng Kotlin ngoài kia:
context?.let {
val color = ContextCompat.getColor(it, R.color.colorPrimary)
// ...
}
val color = ContextCompat.getColor(context, R.color.colorPrimary)
. Biến "nó" có thể là bất cứ thứ gì, nhưng nó cần phải là một Ngữ cảnh .
it
trong trường hợp này là context
, vì tôi sử dụng context?.let {
để kiểm tra nếu context
không phải là null. Hàm getColor()
chỉ chấp nhận một bối cảnh không null. Đọc thêm ở đây về let
và cách sử dụng nó: kotlinlang.org/docs/reference/scope-fifts.html#let
Trong RecyclerView của bạn trong Kotlin
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(t: YourObject, listener: OnItemClickListener.YourObjectListener) = with(itemView) {
textViewcolor.setTextColor(ContextCompat.getColor(itemView.context, R.color.colorPrimary))
textViewcolor.text = t.name
}
}
Sử dụng getColor(Resources, int, Theme)
phương pháp của ResourcesCompat
Thư viện hỗ trợ Android.
int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
Tôi nghĩ rằng nó phản ánh câu hỏi của bạn tốt hơn so với câu hỏi getColor(Context, int)
của ContextCompat
bạn Resources
. Trước API cấp 23, chủ đề sẽ không được áp dụng và phương thức gọi đến getColor(int)
nhưng bạn sẽ không có cảnh báo không dùng nữa. Chủ đề cũng có thể được null
.
Nếu bạn không nhất thiết cần tài nguyên, hãy sử dụng parseColor(String)
:
Color.parseColor("#cc0066")
Nếu tối thiểu hiện tạigetColor()
của bạn . Cấp API là 23, bạn chỉ có thể sử dụng như chúng tôi đang sử dụng để lấy tài nguyên chuỗi bằng cách getString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()
Bạn có thể ràng buộc cho các cấp API dưới 23:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
nhưng để đơn giản, bạn có thể thực hiện như dưới đây như câu trả lời được chấp nhận:
textView.setTextColor(ContextCompat.getColor(context, R.color.green))
Từ Tài nguyên .
Tôi cũng nản lòng. Nhu cầu của tôi rất đơn giản. Tất cả những gì tôi muốn là màu ARGB từ các tài nguyên, vì vậy tôi đã viết một phương thức tĩnh đơn giản.
protected static int getARGBColor(Context c, int resId)
throws Resources.NotFoundException {
TypedValue color = new TypedValue();
try {
c.getResources().getValue(resId, color, true);
}
catch (Resources.NotFoundException e) {
throw(new Resources.NotFoundException(
String.format("Failed to find color for resourse id 0x%08x",
resId)));
}
if (color.type != TYPE_INT_COLOR_ARGB8) {
throw(new Resources.NotFoundException(
String.format(
"Resourse id 0x%08x is of type 0x%02d. Expected TYPE_INT_COLOR_ARGB8",
resId, color.type))
);
}
return color.data;
}