getColor (int id) Android 6.0 মার্শমেলো (এপিআই 23) এ হ্রাস পেয়েছে


717

Resources.getColor(int id)পদ্ধতি অবচিত হয়েছে।

@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
    return getColor(id, null);
}

আমার কি করা উচিৎ?


26
কনটেক্সট কমপ্যাট.জেট কালার ব্যবহার করুন (প্রসঙ্গ, আরকোলোআর কলার_নাম)
অশোকচক্রবর্তী নাগরজন

উপরে উল্লিখিত এই পদ্ধতির সাহায্যে: গল কালার (প্রসঙ্গ, আরক্লোর.আর_রঙ); "প্রসঙ্গ" কীভাবে পাবেন তা পরিষ্কার নয়। এটি আমার ক্ষেত্রে কেবল প্রসঙ্গ রেখে কাজ করবে না, অ্যান্ড্রয়েড স্টুডিও ৩.২। আমি এটি আমার জন্য কাজ খুঁজে। .setTextColor (Color.RED)।
হ্যারি

উত্তর:


1347

অ্যান্ড্রয়েড সমর্থন লাইব্রেরি 23 থেকে শুরু করে
একটি নতুন গেটকালার () পদ্ধতি যুক্ত করা হয়েছে ContextCompat

সরকারী জাভাডক থেকে এর বিবরণ:

একটি নির্দিষ্ট রিসোর্স আইডির সাথে যুক্ত একটি রঙ ফেরত দেয়

এম থেকে শুরু করে, প্রত্যাবর্তিত রঙটি নির্দিষ্ট প্রসঙ্গের থিমের জন্য স্টাইল করা হবে।


সুতরাং, কেবল কল করুন :

ContextCompat.getColor(context, R.color.your_color);


আপনি ContextCompat.getColor() গিটহাবের উত্স কোডটি চেক করতে পারেন ।


1
এটি সমাধানটির মতো দেখায়, তবে যখন আমরা একটি ত্রুটি পাই "তখন কি এখানে সংস্থান আইডির পরিবর্তে সমাধান করা রঙটি পাস করা উচিত"? আমি যতদূর বলতে পারি এটি সম্ভবত কারণ যে লিন্ট সমর্থন লাইব্রেরির নতুন এপিআইকে স্বীকৃতি দেয় না, তাই সম্ভবত কেবলমাত্র একটি মন্তব্য যোগ করুন @ সাপ্লাইস ওয়ার্নিংস ("রিসোর্সএএসক্লোর") যাওয়ার উপায়? যদিও আমি এটি বেশি পছন্দ করি না।
স্টান

1
হাই @ স্ট্যান, আপনি কি দয়া করে সেই পদ্ধতি কলটির সাথে কোড স্নিপেট সরবরাহ করতে পারেন যা "রিসোর্সএএসকলার" লিন্টকে ট্রিগার করে?
araks

"ইন্ট কালার = কনটেক্সট কমপ্যাট.জেট কালার (এটি, আর-কোলোর.ওরেঞ্জ);" এবং তারপরে "স্প্যান = নতুন ফোরগ্রাউন্ড কালারস্প্যান (রঙ);"। লাল রঙে আন্ডারলাইন হওয়া শব্দটি হ'ল "রঙ" যেখানে আমি এটিকে "নতুন ফোরগ্রাউন্ডার কালারস্প্যান ()" তে প্রেরণ করি।
স্টান

1
@ মনিকাবলবাও ওহ ... দুঃখিত, আমি আপনার মন্তব্যটি ভুল বুঝেছি! :)
araks

3
ContextCompatApi23 এই চিহ্ন ত্রুটি আপনি উল্লেখ ContextCompat supossed
Webserveis

498

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

আপনি যদি থিমগুলি সম্পর্কে যত্নশীল হন তবে ডকুমেন্টেশনটি নির্দিষ্ট করে:

এম থেকে শুরু করে, প্রত্যাবর্তিত রঙটি নির্দিষ্ট প্রসঙ্গের থিমের জন্য স্টাইল করা হবে


4
এটি সঠিক উত্তর হিসাবে নির্বাচিত হওয়া উচিত। কারণ অ্যান্ড্রয়েড ডক্সের প্রদত্ত লিঙ্কে, এটি বলেছে " শুরু হয়ে M, ফিরে আসা রঙটি নির্দিষ্ট প্রসঙ্গের থিমের জন্য স্টাইল করা হবে " "
বাগগুলি ঘটেছে

1
সংকলন 'com.android.support:appcompat-v7:23.0.1'
জি ও'রিলা

@ জি ও'রিলা যেমন আপনি ডকুমেন্টেশনে দেখতে পাচ্ছেন 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উত্তরটি না রাখাই বুদ্ধিমানের কাজ ।
মেলভিন

1
ধন্যবাদ @ মেলভিন, যদি ব্যবহার করা হয় তবে আমার উদাহরণ এখানে: int colorTwitterBlue = ContextCompat.getColor (এটি, R.color.color_twitter_blue); composeTweetAlertDialog.getButton (AlertDialog.BUTTON_NEGATIVE) .setTextColor (colorTwitterBlue); composeTweetAlertDialog.getButton (AlertDialog.BUTTON_POSITIVE) .setTextColor (colorTwitterBlue);
লারা রাফেল কোলস

1
@Melvin। এর অর্থটি কী বোঝায় যে 'রঙটি নির্দিষ্ট প্রসঙ্গের থিমের সাথে স্টাইল করা হবে'। মতামত থিমের উপর নির্ভর করে একই রঙের আইডির জন্য বিভিন্ন বর্ণ নির্ধারণ করতে পারে। ঠিক কীভাবে এটি করা হয়?
রবার্তো কিউবা

46

আমি কেবল গেট কালারের জন্য সমর্থন লাইব্রেরি অন্তর্ভুক্ত করতে চাই না , তাই আমি এরকম কিছু ব্যবহার করছি

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);

4
উত্স কোডটির দিকে তাকানো, সমর্থন লাইব্রেরি ঠিক এটিই করে। আমি এপিআই> = 21 কে লক্ষ্য করি তাই আমি এই কয়েকটি লাইনের জন্য একটি পূর্ণ জারটি অন্তর্ভুক্ত করতে চাই না। নোট করুন যে আপনি অ্যান্ড্রয়েড স্টুডিওতে সতর্কতা দমন করতে পারবেন অবহেলিত কলের উপরে "// noinspication অবচয়" যোগ করে। এবং কোনও অ্যাপ্লিকেশন প্রসঙ্গ নয়, কোনও কার্যকলাপের প্রসঙ্গ ব্যবহার করুন বা আপনি থিমের তথ্য হারাতে পারেন।
personne3000

2
এটি সঠিক উত্তর হওয়া উচিত, যদিও সমর্থন লাইব্রেরিটি ভবিষ্যতের প্রুফ পছন্দ হতে পারে, তবে আমি একমত যে এই কারণটি যদি আপনি সমর্থন লাইব্রেরি অন্তর্ভুক্ত করেন তবে এই দু'টি লাইনকে অন্তর্ভুক্ত করে রাখা ভাল।
এন্থনিমনোরি

30

অ্যান্ড্রয়েড মার্শমেলোতে অনেকগুলি পদ্ধতি অবমূল্যায়ন করা হয়।

উদাহরণস্বরূপ, রঙের ব্যবহার পেতে

ContextCompat.getColor(context, R.color.color_name);

আকর্ষণীয় ব্যবহার পেতে

ContextCompat.getDrawable(context, R.drawable.drawble_name);

3
পরিবর্তনশীল প্রসঙ্গটি কোথা থেকে আসে? আমি কি এটি আরম্ভ করতে হবে? আমি এটি কাজ করতে পারি না। আমার কাছে মনে হচ্ছে অ্যান্ড্রয়েন্ডের অনেক দীর্ঘ পথ রয়েছে; এটি আমার চিত্তকে আঘাত করে যে আমি একটি এক্সএমএল রিসোর্স থেকে AF রঙ পেতে কতটা সংগ্রাম করছি! বাহ
কোল্ড টুনা

29

বাইরে থাকা সমস্ত কোটলিন ব্যবহারকারীদের জন্য:

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
পল Spiesberger

4

কোটলিনে আপনার রিসাইক্লারভিউতে

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
    }
}

1

অ্যান্ড্রয়েড সমর্থন লাইব্রেরি থেকে এর getColor(Resources, int, Theme)পদ্ধতিটি ব্যবহার করুন ResourcesCompat

int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);

আমি এটা ভাল চেয়ে আপনার প্রশ্নের প্রতিফলিত মনে getColor(Context, int)এর ContextCompatযেহেতু আপনি সম্পর্কে জিজ্ঞাসা Resources। এপিআই স্তরের ২৩ এর আগে, থিমটি প্রয়োগ করা হবে না এবং পদ্ধতিটি কল করে getColor(int)তবে আপনার হ্রাসকারী সতর্কতা পাবেন না। থিমটিও হতে পারে null


1
আপনি থিম আর্গুমেন্ট হিসাবে নাল পাস করলে, প্রত্যাবর্তিত রঙটি বর্তমান থিমের জন্য স্টাইল করা হবে না। সুতরাং এটি ভুল হতে পারে।
21


1

যদি আপনার বর্তমান নূন্যতম। এপিআই স্তরটি হ'ল 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))

রিসোর্স থেকে ।

কনটেক্সট কমপ্যাট অ্যান্ড্রয়েডএক্স থেকে ।

কনটেক্সটকম্যাট সমর্থন থেকে


0

আমিও হতাশ হয়ে গেলাম। আমার দরকার ছিল খুব সোজা। আমি যা চেয়েছিলাম তা হ'ল সংস্থানগুলি থেকে এআরজিবি রঙ, তাই আমি একটি সাধারণ স্ট্যাটিক পদ্ধতি লিখেছিলাম।

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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.