রঙ রিসোর্স থেকে কালার-ইন পান


448

কোনও রঙ সংস্থান থেকে কোনও রঙ-ইন্টি পাওয়ার কোনও উপায় আছে কি? আমি রিসোর্সে সংজ্ঞায়িত রঙের পৃথক লাল, নীল এবং সবুজ উপাদানগুলি পাওয়ার জন্য চেষ্টা করছি (আর। কোডার.মায়ার কালার) যাতে আমি তিনটি সন্ধানকারের মানগুলিকে একটি নির্দিষ্ট স্তরে সেট করতে পারি।

উত্তর:


928

তুমি ব্যবহার করতে পার:

getResources().getColor(R.color.idname);

কাস্টম রঙগুলি কীভাবে সংজ্ঞায়িত করতে হয় তা এখানে দেখুন:

http://sree.cc/google/android/defining-custom-colors-using-xml-in-android

সম্পাদনা (1): যেহেতু এখন হ্রাসgetColor(int id) করা হয়েছে , তাই এটি অবশ্যই ব্যবহার করা উচিত:

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

(সমর্থন লাইব্রেরিতে 23 যোগ করা হয়েছে)

সম্পাদনা করুন (2):

নীচে কোড মার্শমেলো প্রাক (পূর্ববর্তী 23 এবং পোস্ট) উভয়ের জন্য ব্যবহার করা যেতে পারে

ResourcesCompat.getColor(getResources(), R.color.your_color, null); //without theme

ResourcesCompat.getColor(getResources(), R.color.your_color, your_theme); //with theme

7
Android.R.color.some_color সম্পর্কে কি :-(
ব্লুন্ডেল

17
@ ব্লুন্ডেল উহ, ডুনো আপনার এখনই এটির প্রয়োজন হয় তবে এটি android.R.color.some_colorখুব কার্যকর উদাহরণস্বরূপ: getResources().getColor(android.R.color.holo_blue_bright)(কমপক্ষে, এপিআই 17 তে)
আতাউলম

30
getColor () এখন অবচয় করা হয়েছে, আপনি ব্যবহার করতে পারেন: ContextCompat.getColor (প্রসঙ্গ, R.color.your_color);
রিকার্ডো

2
আমি বুঝতে পারি যে আপনি সম্পাদনা করেছেন তিনিই নন, তবে ContextCompatএবং এর মধ্যে পার্থক্য কী ResourcesCompat? যদি কোনও ব্যবহারিক পার্থক্য না থাকে তবে আপনি যদি তার উত্তর থেকে একটি মুছে ফেলেন তবে তা কম বিভ্রান্ত হবে।
সুরগাচ

14
গুগল কেন সেই ভয়াবহ অ্যাপ কমপ্যাক্ট লাইব্রেরির জন্য পুরোপুরি ভাল ফাংশনটি হ্রাস করার প্রয়োজনীয়তা অনুভব করে। এটা চুষে, উভয় আছে।
অ্যান্ড্রু এস

116

নতুন অ্যান্ড্রয়েড সমর্থন লাইব্রেরি (এবং এই আপডেট) এর উপর ভিত্তি করে এখন আপনার কল করা উচিত:

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

ডকুমেন্টেশন অনুযায়ী :

public int getColor (int id)

এই পদ্ধতিটি API স্তরের 23 স্তরে অবনতি হয়েছে । পরিবর্তে getColor (int, থিম) ব্যবহার করুন

এটি একই সমাধান getResources().getColorStateList(id):

আপনাকে এটিকে এভাবে পরিবর্তন করতে হবে:

ContextCompat.getColorStateList(getContext(),id);

2019 এর সম্পাদনা করুন

ThemeOverlayনিকটতম দৃশ্যের প্রসঙ্গে ব্যবহার সম্পর্কে :

val color = ContextCompat.getColor(
  closestView.context,
  R.color.name.color
)

সুতরাং এইভাবে আপনি আপনার থিম ওভারলে এর উপর ভিত্তি করে সঠিক রঙটি পান।

অন্ধকার / হালকা থিমের মতো একই ক্রিয়াকলাপে আপনি যখন বিভিন্ন থিম ব্যবহার করেন তখন বিশেষ প্রয়োজন। আপনি থিম এবং স্টাইলগুলি সম্পর্কে আরও জানতে চাইলে এই আলাপটি প্রস্তাবিত: স্টাইলের সাথে থিমগুলি বিকাশ করা

নিক কসাই - ড্রয়েডকন বার্লিন - স্টাইলের সাথে থিমগুলি বিকাশ করছে


10
ভাবছি কি নতুন পদ্ধতিতে থিম হিসেবে পূরণ করার জন্য তাদের জন্য, Themeনাল হিসাবে পাস করা যাবে, তাই শুধু কল getColor(R.color.my_color, null)যদি তুমি নিশ্চিত না কি থিমে পাস।
w3bshark

হুম ... এটি যা বলে সবাই কিন্তু আমি এটি কাজ করতে পারি না। আমার কি প্রসঙ্গটি শুরু করতে হবে? বর্তমানে আমি পেয়েছি "প্রতীক 'প্রসঙ্গটি সমাধান করতে পারে না"
কোল্ড টুনা

আপনি এটি সঠিকভাবে করছেন কিনা তা নিশ্চিত করার জন্য, এটিকে ক্রিয়াকলাপের অনক্রিটের মধ্যে কল করার চেষ্টা করুন, প্রসঙ্গ পাওয়ার চেয়ে আপনাকে getContext () বা "" এটি "কল করতে হবে
Ultimo_m

35

আপনার রঙ নির্ধারণ করুন

মান / color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- color int as #AARRGGBB (alpha, red, green, blue) -->
    <color name="orange">#fff3632b</color>
    ...
    <color name="my_view_color">@color/orange</color>

</resources>

রঙটি ইনট করুন এবং সেট করুন

int backgroundColor = ContextCompat.getColor(context, R.color.my_view_color);
// Color backgroundColor = ... (Don't do this. The color is just an int.)

myView.setBackgroundColor(backgroundColor);

আরো দেখুন


1
আপনি কেবল getResources()একটি Activityবা ব্যবহার করতে পারেন Fragment?
Zapnologica

2
@ জাপানোলজিকা, কোনও ক্রিয়াকলাপ বা খণ্ডের বাইরে ব্যবহার করার চিন্তাগুলির জন্য এই প্রশ্নের উত্তর দেখুন getResources()
সুরগাচ

1
পছন্দ করুন getResources()কনটেক্সট বাস্তবায়ন করার জন্য যে কোনও কিছুর উপর এবং ভিউতেও সর্বজনীন এপিআই হিসাবে উপলব্ধ।
ataulm

7

সেরা পন্থা

@ স্যাট উত্তর হিসাবে, রঙ পাওয়ার জন্য ভাল পদ্ধতির হয়

ResourcesCompat.getColor(getResources(), R.color.your_color, null);

বা যখন আপনার getResources()পদ্ধতিতে অ্যাক্সেস নেই তখন নীচের উপায়ে ব্যবহার করুন ।

Context context  = getContext(); // like Dialog class
ResourcesCompat.getColor(context.getResources(), R.color.your_color, null);

আমি কি করি

public void someMethod(){
    ...
    ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
}

আপনার অ্যাপের যে কোনও জায়গায় ব্যবহার করা সবচেয়ে সহজ! এমনকি ইউটিলি ক্লাসে বা এমন কোনও ক্লাসে যেখানে আপনার কনটেক্সট বা গেট রিসোর্স নেই ()

সমস্যা (যখন আপনার প্রসঙ্গটি নেই)

আপনার ক্লাসে কোনও পদ্ধতির মতো আপনারContext যখন অ্যাক্সেস নেইUtil

প্রসঙ্গ ছাড়াই নীচের পদ্ধতিটি ধরে নিন।

public void someMethod(){
    ...
    // can't use getResource() without Context.
}

এখন আপনি Contextএই পদ্ধতিতে প্যারামিটার হিসাবে পাস এবং ব্যবহার করবেনgetResources().

public void someMethod(Context context){
    ...
    context.getResources...
}

সুতরাং এখানে একটি বোনাস অনন্য সমাধান রয়েছে যার মাধ্যমে আপনি যে কোনও জায়গা থেকে সংস্থানগুলি অ্যাক্সেস করতে পারেন Util class। যোগ Resourcesআপনার টু Applicationবর্গ বা একটি তৈরি করেন কোন অস্তিত্ব নেই।

import android.app.Application;
import android.content.res.Resources;

public class App extends Application {
    private static App mInstance;
    private static Resources res;


    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        res = getResources();
    }

    public static App getInstance() {
        return mInstance;
    }

    public static Resources getResourses() {
        return res;
    }

}

আপনার manifest.xml <applicationট্যাগে নাম ক্ষেত্র যুক্ত করুন । (যদি ইতিমধ্যে যোগ না করা হয়)

<application
        android:name=".App"
        ...
        >
        ...
    </application>

এখন আপনি যেতে ভাল। ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);অ্যাপের যে কোনও জায়গায় ব্যবহার করুন।


5

আমি ব্যবহার করার জন্য আপডেট করেছি ContextCompat.getColor(context, R.color.your_color);তবে কখনও কখনও (কিছু ডিভাইস / অ্যান্ড্রয়েড সংস্করণে I'm

সুতরাং এটি সমস্ত ডিভাইস / সংস্করণে কাজ করার জন্য, আমি নাল পয়েন্টারের ক্ষেত্রে এটি করার পুরানো পদ্ধতিতে ফিরে আসি।

try {
    textView.setTextColor(ContextCompat.getColor(getActivity(), R.color.text_grey_dark));
}
catch(NullPointerException e) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        textView.setTextColor(getContext().getColor(R.color.text_grey_dark));
    }
    else {
        textView.setTextColor(getResources().getColor(R.color.text_grey_dark));
    }
}

সমস্ত ক্ষেত্রে কেন পুরানো সংস্করণ ব্যবহার করবেন না, বা আপনি যেভাবেই সংস্করণটি পরীক্ষা করছেন, Resources.getColor(int, Theme)যদি আপনি পারেন তবে নতুন এপিআই ব্যবহার করবেন ? আপনার রানটাইম ব্যতিক্রমগুলি ধরা উচিত নয়।
আতাউলম

আমি মনে করি শুধু ওসিডি। কনটেক্সট কমপ্যাট, আমার কাছে এটি করার ভবিষ্যতের প্রমাণ উপায় এবং তাই সঠিক উপায় বলে মনে হচ্ছে। সুতরাং আমার পদ্ধতিটি হ'ল, এটি সঠিক উপায়ে করুন। এবং যদি এটি ব্যর্থ হয় (পুরানো ডিভাইস বা যাই হোক না কেন), এটি পুরানো উপায়ে করুন। রানটাইম কেন আমার ব্যতিক্রম ধরা উচিত নয়?
নিনজাচিপি

1

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

@ স্যাট এর সঠিক উত্তরটি ব্যবহার করে:

int alpha = ... // 0-255, calculated based on some business logic
int actionBarBackground = getResources().getColor(R.color.actionBarBackground);
int actionBarBackgroundWithAlpha = Color.argb(
        alpha,
        Color.red(actionbarBackground),
        Color.green(actionbarBackground),
        Color.blue(actionbarBackground)
);

1

পাশাপাশি কাজ করে এমন একটি সহজ উপায় খুঁজে পেয়েছে:

Color.parseColor(getString(R.color.idname);

আকর্ষণীয়, বুঝতে পারিনি যে আপনি এভাবে স্ট্রিং হিসাবে রঙ পেতে পারেন। আমি এটি সহজ বলে মনে করি না তবে এটি আকর্ষণীয়
এটআলম

0

অ-অ্যাক্টিভিটি ক্লাস থেকে রঙ অ্যাক্সেস করা কঠিন হতে পারে। আমি যে বিকল্পগুলির সন্ধান পেয়েছি তার মধ্যে একটি হ'ল ব্যবহার করা enumenumনমনীয়তা অনেক প্রস্তাব।

public enum Colors
{
  COLOR0(0x26, 0x32, 0x38),    // R, G, B
  COLOR1(0xD8, 0x1B, 0x60),
  COLOR2(0xFF, 0xFF, 0x72),
  COLOR3(0x64, 0xDD, 0x17);


  private final int R;
  private final int G;
  private final int B;

  Colors(final int R, final int G, final int B)
  {
    this.R = R;
    this.G = G;
    this.B = B;
  }

  public int getColor()
  {
    return (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);
  }

  public int getR()
  {
    return R;
  }

  public int getG()
  {
    return G;
  }

  public int getB()
  {
    return B;
  }
}


0

যদি আপনার বর্তমান নূন্যতম। এপিআই স্তরটি হ'ল 23, আপনি কেবল getColor()যেমনটি ব্যবহার করতে চাই তেমন ব্যবহার করতে পারেন getString():

//example
textView.setTextColor(getColor(R.color.green));
// if context is not available(ex: not in activity) use with context.getColor()

আপনি যদি এপিআই স্তরের নীচে চান তবে 23কেবল এটি ব্যবহার করুন:

textView.setTextColor(getResources().getColor(R.color.green));

কিন্তু মনে রাখবেন যে getResources().getColor()এপিআই লেভেল মধ্যে অবচিত 23। সেক্ষেত্রে উপরের সাথে প্রতিস্থাপন করুন:

textView.setTextColor(ContextCompat.getColor(this /*context*/, R.color.green)) //Im in an activity, so I can use `this`

প্রসঙ্গকম্প্যাট : বৈশিষ্ট্যগুলিতে অ্যাক্সেসের জন্য সহায়ক HelpContext

আপনি চাইলে SDK_INTনীচের মত সীমাবদ্ধ করতে পারেন :

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    textView.setTextColor(getColor(R.color.green));
} else {
    textView.setTextColor(getResources().getColor(R.color.green));
}

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

ক্রিয়াকলাপে

ContextCompat.getColor(actvityname.this, R.color.your_color);

খণ্ডে

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

উদাহরণ স্বরূপ:

tvsun.settextcolour(ContextCompat.getColor(getActivity(), R.color.your_color))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.