আমি যদি কোনও চিত্রের নাম জানি তবে কীভাবে আমি এটির উত্স আইডি পাব?


উত্তর:


269

এরকম কিছু সহ:

String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());

10
ধন্যবাদ, এটি আমাকে একটি অনুরূপ সমস্যার সমাধান খুঁজতে সহায়তা করেছে! আমি getResources().getIdentifier(name, "id", getPackageName());একটি ইমেজবটন আইডি পেতে ব্যবহার করব (যেমন আপনি R.id.name এর সাথে থাকবেন)।
Select0r

42
দ্রষ্টব্য যে নামটি ".png" এর মতো কোনও এক্সটেনশন অন্তর্ভুক্ত করা উচিত নয়
লারহাম 1

1
পরিবর্তনশীল মধ্যে ঠিক কি যায় name? আমি এমন একটি বোতামের আইডি সন্ধান করতে চাই যার রেফারেন্সটি আমি জানি, আমার ক্ষেত্রে এটিbutton1
জন ওয়াটসন

1
getResource()এবং getPackageName()ত্রুটি দেখাচ্ছে cannot resolve method
শ্রুজান বড়াই

@ শ্রুজান বড়াই getResource()এবং getPackageName()ক্রিয়াকলাপ থেকে পদ্ধতি are
বার্গা

29

আপনি এটি ব্যবহার করে দেখতে পারেন:

try {
    Class res = R.drawable.class;
    Field field = res.getField("drawableName");
    int drawableId = field.getInt(null);
}
catch (Exception e) {
    Log.e("MyTag", "Failure to get drawable id.", e);
}

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

লিঙ্ক: অ্যান্ড্রয়েডে গতিশীলভাবে সংস্থান পুনরুদ্ধার


2
এটি সম্ভবত দ্রুত হতে পারে তবে আমি দেখেছি আপনি অগ্রগতি ব্যবহার করলে এটি আপনাকে সমস্যায় ফেলতে পারে। এটি আমার পক্ষে কমপক্ষে অগ্রগতিতে কাজ করে নি
পেড্রো রেইনহো

জেনেরিক ব্যতিক্রম ধরা বিশেষত খারাপ ধারণা। তদ্ব্যতীত, নোট করুন যে যদি অঙ্কনযোগ্যগুলির জন্য কোনও শক্ত রেফারেন্স না থাকে তবে প্রুগার্ড রেফারেন্সটিকে অপ্টিমাইজ করতে পারে কারণ এটি বিশ্বাস করে না যে এটি কোথাও ব্যবহৃত হচ্ছে।
পল ল্যামার্টসমা

আমি এখন বুঝতে পেরেছি :) আপনি বোঝাতে চাইছেন যে অপ্টিমাইজেশনের সময় অঙ্কনযোগ্য নাম পরিবর্তন এবং সংস্থানটি এই পদ্ধতিটি ব্যবহার করে খুঁজে পাওয়া যাবে না, যদি আমি ঠিক থাকি? :)
ভিএসবি

1
@ ভিএসবি: যদি আপনার শেষ মন্তব্যটি সঙ্গে সঙ্গে উপরে পল ল্যামার্তসমা মন্তব্যের প্রতিক্রিয়া জানায়: না, তিনি এর অর্থ হলেন যে প্রিগার্ড জানেন না এটি এই উত্সটির একটি উল্লেখ, এবং তাই এটি ব্যবহার করা হয়নি বিশ্বাস করে এই উত্সটি সরিয়ে ফেলতে পারে।
নির্মাতা স্টিভ

আপনি একবার xxxxhdpi, xxhdpi, ইত্যাদি ব্যবহার করার পরে এই পদ্ধতিটি কম দরকারী হয়ে উঠবে
কেউ কোথাও

11

পাবলিক সিস্টেম রিসোর্সের উদাহরণ:

// this will get id for android.R.drawable.ic_dialog_alert
int id = Resources.getSystem().getIdentifier("ic_dialog_alert", "drawable", "android");

সতর্ক

আর একটি উপায় হ'ল অ্যান্ড্রয়েড.আর.ড্রেবলযোগ্য বর্গের জন্য ডকুমেন্টেশনগুলি উল্লেখ করা ।


1
@ মিলাআদ তোমার কি অর্থ?
নেক্সা

এর অর্থ আমি কোডের সংস্থানগুলিতে বিভ্রান্ত হয়েছি এবং আমি এটি অ-ক্রিয়াকলাপ শ্রেণিতে ব্যবহার করি
মিলাবাদ

1
@ মিলিয়াদ এই পদ্ধতিটি সিস্টেম সংস্থানগুলির জন্য। তারা প্রসঙ্গে নির্ভর করে না।
নেক্সা

10

রিসোর্স আইডি পেতে আপনি এই ফাংশনটি ব্যবহার করতে পারেন:

public static int getResourseId(Context context, String pVariableName, String pResourcename, String pPackageName) throws RuntimeException {
    try {
        return context.getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
    } catch (Exception e) {
        throw new RuntimeException("Error getting Resource ID.", e)
    } 
}


সুতরাং আপনি যদি একটি অঙ্কনযোগ্য রিসোর্স আইডি পেতে চান তবে আপনি এই পদ্ধতিটিতে কল করতে পারেন:

getResourseId(MyActivity.this, "myIcon", "drawable", getPackageName());

(বা কোনও খণ্ড থেকে):

getResourseId(getActivity(), "myIcon", "drawable", getActivity().getPackageName());


একটি জন্য স্ট্রিং রিসোর্স আইডি আপনি এটা ভালো কল করতে পারেন:

getResourseId(getActivity(), "myAppName", "string", getActivity().getPackageName());

ইত্যাদি ...


সাবধান হন : এটি একটি RuntimeException ছোঁড়ার যদি এটা রিসোর্স আইডি খুঁজে পেতে ব্যর্থ। উত্পাদন সঠিকভাবে পুনরুদ্ধার করতে ভুলবেন না।

এটি পড়ুন


4
আমি মনে করি আপনার এটি থেকে সরিয়ে staticনেওয়া দরকার , অন্যথায় getResources()এটি কাজ করবে না।
রিচার্ড লে ম্যাসুরিয়ার

@ রিচার্ড লে ম্যাসুরিয়ার, আপনি কেন ব্যাখ্যা করতে পারেন? ধন্যবাদ.
বীর

1
@ লিও.হান যখন আমি এই মন্তব্যটি করেছিলাম Contextতখন তা পাওয়া যায় নি। ফিক্স হয় হয় এটি সরানোর staticএবং একটি Context(যেমন Activityবা Application) মধ্যে সরানো ; বা বিকল্প সমাধান হ'ল জোনাথন তার সম্পাদনায় যা করেছিলেন তা পদ্ধতিতে প্রেরণ Context
রিচার্ড লে ম্যাসুরিয়ার

1
@ রিচার্ড লে ম্যাসুরিয়ার, আমি এখনই সম্পাদনার ইতিহাস পরীক্ষা করেছি, আপনি যা বলেছেন ঠিক তেমনই, এত বছর পরে আপনার সদয় উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ :)
বীর ২

0

আমি আর একটি দৃশ্যের মুখোমুখি হয়েছি।

স্ট্রিং ইমেজনাম = "হ্যালো" এবং তারপরে যখন এটি প্রথম আর্গুমেন্ট হিসাবে getIdentifier ফাংশনে স্থানান্তরিত হয়, এটি স্ট্রিং নাল সমাপ্তির সাথে নামটি পাস করবে এবং সর্বদা শূন্য ফিরে আসবে। এই ইমেজনাম.সুবস্ট্রিং (0, ইমেজনাম.এলেথ () - 1) পাস করুন

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