অ্যান্ড্রয়েড, স্ট্রিং থেকে রিসোর্স আইডি পাচ্ছেন?


158

আমার ক্লাসগুলির একটিতে একটি পদ্ধতিতে আমার একটি সংস্থান আইডি পাস করতে হবে। রেফারেন্সটি নির্দেশ করে যে আইডি উভয়ই এটি ব্যবহার করতে হবে এবং এটির স্ট্রিংও প্রয়োজন। আমার কীভাবে এটি সর্বোত্তমভাবে অর্জন করা উচিত?

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

R.drawable.icon

আমার এর পূর্ণসংখ্যা আইডিটি পাওয়া দরকার, তবে আমার "আইকন" স্ট্রিংয়ের অ্যাক্সেসও প্রয়োজন।

এটি পছন্দনীয় হবে যদি আমাকে সমস্ত পদ্ধতিতে পাস করতে হয় তবে "আইকন" স্ট্রিং থাকে।


অভ্যন্তরীণ স্টোরেজে সংরক্ষণ করা ফাইলগুলির আইডি পাওয়া কি একইভাবে সম্ভব? আমার সমস্যা আছে কারণ আমার গ্যালারীটিতে অবস্থানের পরিবর্তে আইডির অ্যারে সরবরাহ করা উচিত (এটি ভেবেছিলেন এটি অ্যাডাপ্টারের) .. ধন্যবাদ
ইওকস

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

উত্তর:


171

@ ইবোমাইক: আমি জানতাম না যে Resources.getIdentifier()বিদ্যমান ছিল।

আমার প্রকল্পগুলিতে আমি এটি করতে নিম্নলিখিত কোডগুলি ব্যবহার করেছি:

public static int getResId(String resName, Class<?> c) {

    try {
        Field idField = c.getDeclaredField(resName);
        return idField.getInt(idField);
    } catch (Exception e) {
        e.printStackTrace();
        return -1;
    } 
}

এটি R.drawable.iconরিসোর্স পূর্ণসংখ্যার মান পাওয়ার জন্য এটির মতো ব্যবহার করা হবে

int resID = getResId("icon", R.drawable.class); // or other resource class

আমি সবেমাত্র একটি ব্লগ পোস্ট পেয়েছি যা বললাম যা Resources.getIdentifier()আমার মতো প্রতিচ্ছবি ব্যবহার করার চেয়ে ধীর। এটি পরীক্ষা করে দেখুন


8
@ ম্যাকার্সে: বর্তমানে getIdentifier()দুটি রিফ্লেকশন লুকআপ করতে হবে। উপরের আপনার উদাহরণে, getIdentifier()প্রতিচ্ছবিটি পেতে ব্যবহার করবে Drawable.class, তারপরে সংস্থান আইডিটি পাওয়ার জন্য অন্য প্রতিচ্ছবি দেখুন। এটি গতির পার্থক্যের জন্য অ্যাকাউন্ট করবে। বলা হচ্ছে, দুটিই বিশেষত দ্রুত নয় এবং তাই প্রকৃতপক্ষে ক্যাশে হওয়া প্রয়োজন (বিশেষত যদি একটি লুপে ব্যবহৃত হয় বা একটিতে সারিগুলির জন্য ListView)। এবং প্রতিচ্ছবি পদ্ধতির বড় সমস্যাটি হ'ল এটি Android এর অভ্যন্তরীণ সম্পর্কে অনুমান করে যা ভবিষ্যতে প্রকাশিত হতে পারে change
কমন্সওয়্যার

1
@ কমন্সওয়্যার: ঠিক আছে আমি কীভাবে অ্যান্ড্রয়েড বাস্তবায়ন করছিলাম তা যাচাই করছিলাম এবং এটি একটি নেটিভ কল হিসাবে শেষ হবে। gitorious.org/android-eeepc/base/blobs/… => gitorious.org/android-eeepc/base/blobs/…
ম্যাকারসে

3
আমি পরিবর্তে আইডি সহ একটি পূর্ণসংখ্যার অ্যারে ব্যবহার করব। আইডিগুলির জন্য স্ট্রিংগুলি ব্যবহার করা সঠিক পদ্ধতির মতো শোনা যায় না।
ইবোমাইক

9
কেন contextপ্যারামিটার?
রুডি

14
কলিংটি getId হওয়া উচিত ("আইকন", আর .ড্রব্যাবলক্লাস); getResId না ("আইকন", প্রসঙ্গ, Drawable.class);
স্মিত

80

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

public static int getResourceId(String pVariableName, String pResourcename, String pPackageName) 
{
    try {
        return getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
    } catch (Exception e) {
        e.printStackTrace();
        return -1;
    } 
}

সুতরাং আপনি যদি এইভাবে আঁকতে কল ফাংশন পেতে চান

getResourceId("myIcon", "drawable", getPackageName());

এবং স্ট্রিংয়ের জন্য আপনি এটিকে এটি কল করতে পারেন

getResourceId("myAppName", "string", getPackageName());

এটি পড়ুন


11
এমন একটি ফাংশন তৈরির কী উপায় যা কেবল অন্যটিকে কল করে এবং সম্ভাব্য ব্যতিক্রম "পরিচালনা করে"? সরাসরি getRes উত্স ()। GetIdentifier () কল করুন directly
রিকার্ডো মেনেহিন ফিলহো

37

এটি @ ম্যাকার্স উত্তরের উপর ভিত্তি করে।

আরও দ্রুত এবং কোড বান্ধব উপায়ে রিসোর্স আইডি পেতে এটি ব্যবহার করুন।

public static int getId(String resourceName, Class<?> c) {
    try {
        Field idField = c.getDeclaredField(resourceName);
        return idField.getInt(idField);
    } catch (Exception e) {
        throw new RuntimeException("No resource ID found for: "
                + resourceName + " / " + c, e);
    }
}

উদাহরণ:

getId("icon", R.drawable.class);

30

কিভাবে আবেদন করা যায় রিসোর্সের নাম থেকে রিসোর্স আইডি তা বেশ সাধারণ এবং উত্তরের উত্তর।

সংস্থার নাম থেকে কোনও নেটিভ অ্যান্ড্রয়েড রিসোর্স আইডি কীভাবে পাবেন তা কম উত্তর দেওয়া হয় is রিসোর্সের নাম অনুসারে অ্যান্ড্রয়েড অঙ্কনযোগ্য সংস্থান পেতে এখানে আমার সমাধানটি রয়েছে:

public static Drawable getAndroidDrawable(String pDrawableName){
    int resourceId=Resources.getSystem().getIdentifier(pDrawableName, "drawable", "android");
    if(resourceId==0){
        return null;
    } else {
        return Resources.getSystem().getDrawable(resourceId);
    }
}

অন্যান্য ধরণের সংস্থান অ্যাক্সেস করার জন্য পদ্ধতিটি পরিবর্তন করা যেতে পারে।


এখন .getRes উত্স ()। getDrawable হ্রাস করা হয়েছে if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){ return mContext.getDrawable(resourceId); } else { return mContext.getResources().getDrawable(resourceId); }
ইভিলিপার

11

আপনার যদি একটি স্ট্রিং এবং কোনও আন্ত জোড়া লাগাতে হয় তবে মানচিত্রের কীভাবে?

static Map<String, Integer> icons = new HashMap<String, Integer>();

static {
    icons.add("icon1", R.drawable.icon);
    icons.add("icon2", R.drawable.othericon);
    icons.add("someicon", R.drawable.whatever);
}

9

আপনি Resources.getIdentifier()আপনার এক্সএমএল ফাইলগুলিতে যেমন স্ট্রিংটি ব্যবহার করেন তেমনি আপনার স্ট্রিংয়ের জন্য ফর্ম্যাটটি ব্যবহার করার প্রয়োজন থাকলেও আপনি ব্যবহার করতে পারেন package:drawable/icon


আমার উত্তর নীচে এর বিপরীত। রিসোর্স আইডিতে পাস করুন এবং তারপরে getResourceEntryName(id)স্ট্রিংয়ের নামটি সন্ধান করতে ব্যবহার করুন । লম্বা পাঠ্য থেকে "আইকন" খুঁজে পেতে কোনও বিশৃঙ্খলা নেই।
স্টিভ ওয়ারিং

8

আমি এটি পছন্দ করেছিলাম, এটি আমার পক্ষে কাজ করছে:

    imageView.setImageResource(context.getResources().
         getIdentifier("drawable/apple", null, context.getPackageName()));

7
Simple method to get resource ID:

public int getDrawableName(Context ctx,String str){
    return ctx.getResources().getIdentifier(str,"drawable",ctx.getPackageName());
}

1
আপনি নিজের উত্তরের জন্য আরও কিছু তথ্য দিলে আরও ভাল হবে।
xMRi

6

স্ট্রিং থেকে রিসোর্স আইডি পাওয়ার সহজ উপায়। এখানে resourceName অঙ্কনযোগ্য ফোল্ডারে রিসোর্স ImageView যা XML ফাইল পাশাপাশি অন্তর্ভুক্ত করা হয় নাম।

int resID = getResources().getIdentifier(resourceName, "id", getPackageName());
ImageView im = (ImageView) findViewById(resID);
Context context = im.getContext();
int id = context.getResources().getIdentifier(resourceName, "drawable",
context.getPackageName());
im.setImageResource(id);

ধন্যবাদ মানুষ এটি সত্যিই সহায়ক ছিল .. আমি অনেক অনুসন্ধান করেছি এবং এটি কাজ করে নি। আপনার উত্তরটি দেখে, আমি দেখতে পেলাম যে দ্বিতীয় প্যারামিটারটি getIdentifierহতে হবে id। এমনকি অ্যান্ড্রয়েড ডেভ সাইটটিতে এটি উল্লেখ করা হয়নি। আপনি কোথায় এই তথ্য পেয়েছেন?
প্রকাশ জিপিজেড

4

যেহেতু আপনি বলেছিলেন যে আপনি কেবল একটি প্যারামিটারটি পাস করতে চেয়েছিলেন এবং এটি কোনও বিষয় বলে মনে হচ্ছে না, আপনি উত্স সনাক্তকারীটি পাস করতে পারেন এবং তারপরে স্ট্রিংয়ের নামটি সন্ধান করতে পারেন:

String name = getResources().getResourceEntryName(id);

এটি উভয় মান অর্জনের সবচেয়ে কার্যকর উপায় হতে পারে। আপনাকে দীর্ঘতর স্ট্রিং থেকে কেবল "আইকন" অংশটি খুঁজে বেড়াতে হবে না।


2

আপনার রেজ / লেআউটে / আমার_মেজ_লেআউটআউট.এক্সএমএল

<LinearLayout ...>
    <ImageView
        android:id="@+id/row_0_col_7"
      ...>
    </ImageView>
</LinearLayout>

যে চিত্রটি দেখুন তার @ + আইডি মান দ্বারা দখল করতে, আপনার জাভা কোডের ভিতরে এটি করুন:

String row = "0";
String column= "7";
String tileID = "row_" + (row) + "_col_" + (column);
ImageView image = (ImageView) activity.findViewById(activity.getResources()
                .getIdentifier(tileID, "id", activity.getPackageName()));

/*Bottom code changes that ImageView to a different image. "blank" (R.mipmap.blank) is the name of an image I have in my drawable folder. */
image.setImageResource(R.mipmap.blank);  

2

কোটলিন পদ্ধতির

inline fun <reified T: Class<R.drawable>> T.getId(resourceName: String): Int {
            return try {
                val idField = getDeclaredField (resourceName)
                idField.getInt(idField)
            } catch (e:Exception) {
                e.printStackTrace()
                -1
            }
        }

ব্যবহার:

val resId = R.drawable::class.java.getId("icon")

1

মনোড্রয়েড / জ্যামারিন.এন্ড্রয়েড এ আপনি করতে পারেন:

 var resourceId = Resources.GetIdentifier("icon", "drawable", PackageName);

তবে গেটআইডিটিফায়ার হিসাবে এটি অ্যান্ড্রয়েডে প্রস্তাবিত নয় - আপনি এর মতো প্রতিবিম্ব ব্যবহার করতে পারেন:

 var resourceId = (int)typeof(Resource.Drawable).GetField("icon").GetValue(null);

যেখানে আমি আপনাকে চেষ্টা করে যাচ্ছি / ধরুন বা আপনি যে স্ট্রিংগুলি পার করছেন তা যাচাই করুন।


1

স্ট্রিং রিসোর্স নাম থেকে অঙ্কনযোগ্য আইডি পাওয়ার জন্য আমি এই কোডটি ব্যবহার করছি:

private int getResId(String resName) {
    int defId = -1;
    try {
        Field f = R.drawable.class.getDeclaredField(resName);
        Field def = R.drawable.class.getDeclaredField("transparent_flag");
        defId = def.getInt(null);
        return f.getInt(null);
    } catch (NoSuchFieldException | IllegalAccessException e) {
        return defId;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.