Resources.getColor(int id)
পদ্ধতি অবচিত হয়েছে।
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
আমার কি করা উচিৎ?
Resources.getColor(int id)
পদ্ধতি অবচিত হয়েছে।
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
আমার কি করা উচিৎ?
উত্তর:
অ্যান্ড্রয়েড সমর্থন লাইব্রেরি 23 থেকে শুরু করে
একটি নতুন গেটকালার () পদ্ধতি যুক্ত করা হয়েছে ContextCompat
।
সরকারী জাভাডক থেকে এর বিবরণ:
একটি নির্দিষ্ট রিসোর্স আইডির সাথে যুক্ত একটি রঙ ফেরত দেয়
এম থেকে শুরু করে, প্রত্যাবর্তিত রঙটি নির্দিষ্ট প্রসঙ্গের থিমের জন্য স্টাইল করা হবে।
সুতরাং, কেবল কল করুন :
ContextCompat.getColor(context, R.color.your_color);
আপনি ContextCompat.getColor()
গিটহাবের উত্স কোডটি চেক করতে পারেন ।
TL; ড:
ContextCompat.getColor(context, R.color.my_color)
ব্যাখ্যা:
আপনাকে কনটেক্সট কমপ্যাট.জেট কালার () সাপোর্ট ভি 4 লাইব্রেরির অংশ হিসাবে ব্যবহার করতে হবে (এটি পূর্ববর্তী সমস্ত এপিআইয়ের জন্য কাজ করবে)।
ContextCompat.getColor(context, R.color.my_color)
আপনি যদি ইতিমধ্যে সমর্থন লাইব্রেরি ব্যবহার না করেন, dependencies
আপনার অ্যাপ্লিকেশনের অভ্যন্তরে অ্যারেতে আপনাকে নিম্নলিখিত লাইনটি যুক্ত করতে হবে build.gradle
(দ্রষ্টব্য: আপনি যদি ইতিমধ্যে অ্যাপকম্প্যাট (ভি 7) লাইব্রেরি ব্যবহার করেন তবে এটি alচ্ছিক :
compile 'com.android.support:support-v4:23.0.0' # or any version above
আপনি যদি থিমগুলি সম্পর্কে যত্নশীল হন তবে ডকুমেন্টেশনটি নির্দিষ্ট করে:
এম থেকে শুরু করে, প্রত্যাবর্তিত রঙটি নির্দিষ্ট প্রসঙ্গের থিমের জন্য স্টাইল করা হবে
M
, ফিরে আসা রঙটি নির্দিষ্ট প্রসঙ্গের থিমের জন্য স্টাইল করা হবে " "
ContextCompat
ক্লাসটি সাপোর্টভি 4 থেকে আসে। অ্যাপকম্প্যাটভি 7 এটি সাপোর্টভি 4 এর উপর নির্ভর করে বলে কাজ করে। তারা বলে সাপোর্ট লাইব্রেরী ডকুমেন্টেশন , 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.
। সুতরাং AppcompatV7
উত্তরটি না রাখাই বুদ্ধিমানের কাজ ।
আমি কেবল গেট কালারের জন্য সমর্থন লাইব্রেরি অন্তর্ভুক্ত করতে চাই না , তাই আমি এরকম কিছু ব্যবহার করছি
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);
}
}
আমার ধারণা কোডটি ঠিকঠাকভাবে কাজ করা উচিত, এবং অবহেলিত getColor
এপিআই <23 থেকে অদৃশ্য হয়ে যাবে না।
এবং এটি আমি কোটলিনে ব্যবহার করছি:
/**
* 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);
অ্যান্ড্রয়েড মার্শমেলোতে অনেকগুলি পদ্ধতি অবমূল্যায়ন করা হয়।
উদাহরণস্বরূপ, রঙের ব্যবহার পেতে
ContextCompat.getColor(context, R.color.color_name);
আকর্ষণীয় ব্যবহার পেতে
ContextCompat.getDrawable(context, R.drawable.drawble_name);
বাইরে থাকা সমস্ত কোটলিন ব্যবহারকারীদের জন্য:
context?.let {
val color = ContextCompat.getColor(it, R.color.colorPrimary)
// ...
}
val color = ContextCompat.getColor(context, R.color.colorPrimary)
। ভেরিয়েবল "এটি" যে কোনও কিছু হতে পারে তবে এটি প্রসঙ্গে থাকা দরকার ।
it
এই ক্ষেত্রে হয় context
, যেহেতু আমি context?.let {
পরীক্ষা করে ব্যবহার করি যে context
এটি নাল নয়। ফাংশনটি getColor()
কেবল একটি নন-নাল কনটেক্সট গ্রহণ করে। সম্বন্ধে এখানে আরো ভাল পড়ুন let
এবং এটি কিভাবে ব্যবহার করবেন তা: kotlinlang.org/docs/reference/scope-functions.html#let
কোটলিনে আপনার রিসাইক্লারভিউতে
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
}
}
অ্যান্ড্রয়েড সমর্থন লাইব্রেরি থেকে এর getColor(Resources, int, Theme)
পদ্ধতিটি ব্যবহার করুন ResourcesCompat
।
int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
আমি এটা ভাল চেয়ে আপনার প্রশ্নের প্রতিফলিত মনে getColor(Context, int)
এর ContextCompat
যেহেতু আপনি সম্পর্কে জিজ্ঞাসা Resources
। এপিআই স্তরের ২৩ এর আগে, থিমটি প্রয়োগ করা হবে না এবং পদ্ধতিটি কল করে getColor(int)
তবে আপনার হ্রাসকারী সতর্কতা পাবেন না। থিমটিও হতে পারে null
।
আপনার যদি অগত্যা সংস্থান প্রয়োজন হয় না, ব্যবহার করুন parseColor(String)
:
Color.parseColor("#cc0066")
যদি আপনার বর্তমান নূন্যতম। এপিআই স্তরটি হ'ল 23, আপনিgetColor()
স্ট্রিং রিসোর্সগুলি পাওয়ার জন্য যেমন ব্যবহার করছেন তেমনভাবে আপনি ব্যবহার করতে পারেন getString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()
আপনি 23 এর নীচে API স্তরের জন্য সীমাবদ্ধ করতে পারেন:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
তবে এটিকে সহজ রাখতে আপনি নীচের মতো গ্রহণযোগ্য উত্তর হিসাবে করতে পারেন:
textView.setTextColor(ContextCompat.getColor(context, R.color.green))
রিসোর্স থেকে ।
আমিও হতাশ হয়ে গেলাম। আমার দরকার ছিল খুব সোজা। আমি যা চেয়েছিলাম তা হ'ল সংস্থানগুলি থেকে এআরজিবি রঙ, তাই আমি একটি সাধারণ স্ট্যাটিক পদ্ধতি লিখেছিলাম।
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;
}