অ্যানড্রয়েড গেটআরসোর্সগুলি () get


698

নতুন অ্যান্ড্রয়েড এপিআই 22 getResources().getDrawable()দিয়ে এখন অবচয় করা হয়েছে। এখন সর্বোত্তম পন্থাটি শুধুমাত্র ব্যবহার করা getDrawable()

কী বদলে গেল?


আপনি আপনার প্রশ্ন নির্দিষ্ট করতে পারেন? এটা ঠিক যে getDrawable (int id)ক্লাসের পদ্ধতি Resourcesঅবমূল্যায়ন করা হয়েছে। আপনার এখন getDrawable (int id, Resources.Theme theme)নতুন থিমের প্যারামিটার সহ পদ্ধতিটি ব্যবহার করা উচিত ।
কোড বানর

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

কেন এই উভয়টিই অবহেলিত হয়েছে এবং তার সম্পর্কে আরও বিশদ ব্যাখ্যার জন্য আপনি এই বিষয়ে আমার ব্লগ পোস্টটি চেক করতে পারেন । Resources#getDrawable(int)Resources#getColor(int)
অ্যালেক্স লকউড

1
গুগল প্রতিটি প্রতি বঞ্চিত ফাংশন জন্য দ্রুত-সংশোধন করা উচিত। আমি এটি সম্পর্কে এখানে একটি পোস্ট করেছি: কোড. google.com/p/android/issues/detail?id=219495
অ্যান্ড্রয়েড বিকাশকারী

উত্তর:


1026

আপনি কোন ধরণের অঙ্কনযোগ্য লোড করছেন তার উপর নির্ভর করে আপনার সঠিকভাবে (এবং ভবিষ্যতের প্রমাণ ) উপায়টিকে হ্রাস করার জন্য আপনার কাছে কিছু বিকল্প রয়েছে:


ক) drawables সঙ্গে থিম বৈশিষ্ট্য

ContextCompat.getDrawable(getActivity(), R.drawable.name);

আপনার ক্রিয়াকলাপ থিম নির্দেশ হিসাবে আপনি একটি স্টাইলযুক্ত অঙ্কনযোগ্য পাবেন। আপনার সম্ভবত এটিই প্রয়োজন।


খ) থিম বৈশিষ্ট্য ছাড়াই অঙ্কনযোগ্য

ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);

আপনি আপনার স্টাইলহীন অঙ্কনযোগ্য পুরানো উপায়ে পাবেন। অনুগ্রহ করে নোট করুন: অবচিত ResourcesCompat.getDrawable()হয় না !


এক্সট্রা) অন্য থিমের থিম বৈশিষ্ট্য সহ অঙ্কনযোগ্য

ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);

আমার অ্যাপ্লিকেশনটি পরামর্শ বি ব্যবহার করে ক্র্যাশ করেছে এটি কলটি অঙ্কনযোগ্য অরিজিনাল আইকন = রিসোর্সসকম্প্যাট.সেটড্রাব্যাবল (ctxt.getRes स्रोत (), আইকনরেসআইডি, নাল) পছন্দ করে না;
ফ্র্যাক্টালবোজ

আমি এটি এইভাবে ঘোষণা করি: পাবলিক স্ট্যাটিক অকার্যকর সেট ইমেজবটনএনবল (কনটেক্সট সিটি টেক্সট, বুলিয়ান সক্ষম, ইমেজবটন আইটেম, আইকনরেসআইডি) {আইটেম.সেটএনেবল (সক্ষম); অঙ্কনযোগ্য অরিজিনাল আইকন = রিসোর্সসকম্প্যাট.জেটড্রেবল (ctxt.getResources (), আইকনরেসআইডি, নাল); অঙ্কনযোগ্য আইকন = সক্ষম? অরিজিনাল আইকন: রূপান্তরযোগ্য ট্রাজেবলস্কেল (অরিজিনাল আইকন); item.setImageDrawable (আইকন); } এবং এটিকে এটির মতো কল করুন: ইউটিলিটি.সেটম্যাজব্যাটনএনেবল (getContext (), মিথ্যা, পিছনে, আর.ড্রেবলযোগ্য.আররো_মাম);
ফ্র্যাক্টালবোজ

আরও স্পষ্টভাবে, ক্র্যাশটি ঘটছে বলে মনে হচ্ছে কারণ আমার আইকনটি একটি ভেক্টর অঙ্কনযোগ্য।
ফ্র্যাক্টালবোজ

1
xamarin সংস্করণ: রিসোর্সসকম্প্যাট.গেটড্রাব্যাবল (রিসোর্সস, রিসোর্স। ড্রভেবল.নেম, নাল);
ব্রায়ান

আমি আপনাকে আরও একটি শব্দ যুক্ত করি , কনটেক্সটকম্প্যাট.জেট কালার (প্রসঙ্গ, রঙ) আপনাকেও সহায়তা করতে পারে ...
বার্টকিং

746

সম্পাদনা করুন: আরও সম্পূর্ণ ব্যাখ্যার জন্য বিষয়টিতে আমার ব্লগ পোস্টটি দেখুন


পরিবর্তে সমর্থন লাইব্রেরি থেকে আপনার নিম্নলিখিত কোডটি ব্যবহার করা উচিত:

ContextCompat.getDrawable(context, R.drawable.***)

এই পদ্ধতিটি ব্যবহার করা কল করার সমতুল্য:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

এআইপি 21 হিসাবে, আপনার getDrawable(int, Theme)পরিবর্তে পদ্ধতিটি ব্যবহার করা উচিত getDrawable(int), কারণ এটি আপনাকে প্রদত্ত স্ক্রিনের ঘনত্ব / থিমের জন্য কোনও নির্দিষ্ট সংস্থান আইডির সাথে যুক্ত একটি আঁকতে সক্ষম অবজেক্ট আনতে দেয়। অবচিত getDrawable(int)পদ্ধতিতে কল করা কল করার সমতুল্য getDrawable(int, null)


8
আমি মনে করি যে ওপি ক্লাসের getDrawable (int id)পদ্ধতিকেও বোঝায় Context। এটি একই রকম getResources().getDrawable(id, getTheme());এবং নতুন এপিআই ব্যবহার করে।
কোড বানর

9
ডকুমেন্টেশন অনুসারে, মিনি এপিআই 21 স্তরের ব্যবহার প্রয়োজন getDrawable(int, Resources.Theme)
প্রিন্স

@ প্রিন্স পদ্ধতিটি এপিআই 21-এ যুক্ত করা হয়েছে তবে এটি 22
অ্যালেক্স লকউড

অ্যান্ড্রয়েড ডকটি কনটেক্সট :: getDrawable (int) পদ্ধতি ব্যবহার করারও পরামর্শ দেয় তবে এটি যেহেতু এটি শুধুমাত্র 21 এআইপি 21 তে প্রবর্তিত হয়েছিল মনে হয় কনটেক্সট কমপ্যাটটি সেরা পছন্দ।
goRGon

এই উত্তরটি API 21-র চেয়ে পুরানো সংস্করণগুলিতে .svg ফাইলগুলির সাথে কাজ করে না the লাইব্রেরিতে একটি বাগ রয়েছে।
জোর্হে রদ্রিগেজ

141

এই লাইনটি প্রতিস্থাপন করুন: getResources().getDrawable(R.drawable.your_drawable)

সঙ্গে ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)

সম্পাদনা

ResourcesCompatএখন অবচয় করা হয়। তবে আপনি এটি ব্যবহার করতে পারেন:

ContextCompat.getDrawable(this, R.drawable.your_drawable)(এখানে thisপ্রসঙ্গে)

আরও তথ্যের জন্য এই লিঙ্কটি অনুসরণ করুন: কনটেক্সটকম্প্যাট


2
: এখানেই এখন খুব অনুমোদিত হয়নি plus.google.com/+BenjaminWeiss/posts/M1dYFaobyBM
Xyaren

এই লিঙ্কটি দয়া করে দেখুন: ডেভেলপার.অ্যান্ড্রয়েড.
com

2
এটি হ্রাস করা হয়েছে এমন লিঙ্কে বলে না ResourcesCompat। এটা ঠিক কাজ করা উচিত।
জ্যাকব আর

"যদি আপনার আঁকতে সক্ষম" তে কী লিখতে হবে যদি আমি ছবিতে
আঁকতে

29

getResources().getDrawable() 22 এপিআই স্তরে অবনতি হয়েছে Now এখন আমাদের থিমটি যুক্ত করতে হবে:

getDrawable (ইন আইডি, সংস্থানসমূহ। থিম থিম) (এপিআই স্তর 21 এ যুক্ত হয়েছে)

এটি একটি উদাহরণ:

myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));

পরবর্তী সংস্করণগুলির জন্য কীভাবে বৈধতা দেওয়া যায় এটি একটি উদাহরণ:

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, তাই না এটা হওয়া উচিত if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)নাকি if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)? কিছু মনে করো না. নীচে থেকে "এপিআই 21 এ পদ্ধতিটি যুক্ত করা হয়েছিল তবে এটি 22
মার্ক ক্র্যামার

2

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

ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);

এটা আমার জন্য কাজ


প্রি লোলিপপে ভেক্টর ড্রয়যোগ্য ক্র্যাশগুলি লোড করতে অ্যাপ্লিকেশন প্রসঙ্গটি ব্যবহার করে। এটার জন্য কোন ফিক্স?
মুথুরাজ

1
@ মুথুরাজ আমি ললিপপ কেস সহ কোডটির জন্য আমার পরীক্ষার কথা মনে রাখছি না, তবে আপনি তার পরিবর্তে getActivity () বা getRes Source () চেষ্টা করতে পারেন, এটি কি আপনার কোডের সাথে ভাল হয়?
দাসের বসিউউনি

আমি এমভিভিএম প্যাটার্নটি ব্যবহার করছি এবং আমার ভিউমোডেলগুলিতে ক্রিয়াকলাপের প্রসঙ্গটি নেই এমন আঁকিয়ে ফেলতে হবে। এটিতে কেবল প্রয়োগের প্রসঙ্গ রয়েছে। এটাই আমার সমস্যা।
মুথুরাজ

1

আমি কীভাবে একটি তালিকা ভিউ লোড করতে অ্যারেতে সমস্যাটি স্থির করেছি তার একটি উদাহরণ, আশা করি এটি সহায়তা করবে।

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

1

এটা চেষ্টা কর:

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

এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এই কোডটির প্রশ্নের উত্তর কীভাবে তার দীর্ঘমেয়াদী মানকে উন্নত করে সে সম্পর্কে অতিরিক্ত প্রসঙ্গ সরবরাহ করে।
ডোনাল্ড হাঁস


1

getDrawable (int অঙ্কনযোগ্য) এপিআই স্তরে 22 অবমূল্যায়ন করা হয়েছে reference রেফারেন্সের জন্য এই লিঙ্কটি দেখুন

এখন এই সমস্যাটির সমাধানের জন্য আমাদের আইডি সহ একটি নতুন নির্মাতা পাস করতে হবে যেমন: -

getDrawable(int id, Resources.Theme theme)

সমাধানের জন্য এটি করুন: -

জাভাতে: -

ContextCompat.getDrawable(getActivity(), R.drawable.name);   

অথবা

 imgProfile.setImageDrawable(getResources().getDrawable(R.drawable.img_prof, getApplicationContext().getTheme()));

কোটলিনে: -

rel_week.background=ContextCompat.getDrawable(this.requireContext(), R.color.colorWhite)

অথবা

 rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)

আশা করি এটি আপনাকে সহায়তা করবে। ধন্যবাদ


এটি উল্লেখ করার মতো, যে getDrawable (DrawableRes int id, থিম থিম) একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে যদি রিসোর্সটি খুঁজে পাওয়া যায় না, getDrawable (প্রসঙ্গ প্রসঙ্গে, int id) অযোগ্য হয়, তাই এটি ড্রয়যোগ্য দিয়ে ফিরে আসতে হবে? কোটলিনে
পিটোস


0

এখন আপনার এই মত বাস্তবায়ন করা প্রয়োজন

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
        //
    } else {
        //
    }

কোডের একক লাইন অনুসরণ করা যথেষ্ট, সবকিছু কনটেক্সট কমপ্যাট.জেটড্রেবল দ্বারা যত্ন নেবে

ContextCompat.getDrawable(this, R.drawable.your_drawable_file)

0

এই থ্রেডের পরামর্শ প্রয়োগ করার পরেও যারা এই সমস্যাটি এখনও সমাধান করতে পেরেছেন তাদের জন্য (আমি তার মতো হয়ে থাকতাম) আপনার অ্যাপ্লিকেশন ক্লাসে, অনক্রিট () পদ্ধতিতে এই লাইনটি যুক্ত করুন

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)

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


0

কোটলিনে আপনি এক্সটেনশন ব্যবহার করতে পারেন

fun Context.getMyDrawable(id : Int) : Drawable?{

    return  ContextCompat.getDrawable(this, id)
}

তারপর মত ব্যবহার করুন

context.getMyDrawable(R.drawable.my_icon)

-2

বিল্ড।

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