วิธีการได้รับหมายเลขทรัพยากรที่มีชื่อทรัพยากรที่รู้จักกัน?


178

ฉันต้องการเข้าถึงทรัพยากรเช่น String หรือ Drawable โดยใช้ชื่อไม่ใช่ int id

วิธีการที่ฉันจะใช้สำหรับการนี้หรือไม่?



wikipedia พูดว่า kotlin ปรากฏตัวครั้งแรกในปี 2011 คุณจะถามคำถามเกี่ยวกับในปี 2010 ได้อย่างไร
Abhinav Chauhan

คำตอบ:


149

มันจะเป็นสิ่งที่ชอบ:

R.drawable.resourcename

ตรวจสอบให้แน่ใจว่าคุณไม่มีAndroid.Rเนมสเปซที่นำเข้าเนื่องจากอาจทำให้ Eclipse เกิดความสับสน (ถ้านั่นคือสิ่งที่คุณกำลังใช้)

หากวิธีนี้ไม่ได้ผลคุณสามารถใช้getResourcesวิธีของบริบทได้เสมอ...

Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);

ไหนthis.contextจะเป็น intialised Activity, Serviceหรืออื่น ๆContextประเภทรอง

ปรับปรุง:

ถ้าเป็นชื่อที่คุณต้องการResourcesคลาส (ส่งคืนโดยgetResources()) มีgetResourceName(int)เมธอดและ a getResourceTypeName(int)?

อัปเดต 2 :

Resourcesชั้นจะมีวิธีการนี้:

public int getIdentifier (String name, String defType, String defPackage) 

ซึ่งจะส่งคืนจำนวนเต็มของชื่อทรัพยากรที่ระบุประเภท & แพ็คเกจ


Thankq การตอบของคุณ .R.drawable.resourcename ฉันใช้ตอนนี้ฉันต้องได้รับค่าจำนวนเต็มของตนโดยผ่าน ResourceName
อัสวาน

2
R.drawable.resourcename เป็นจำนวนเต็ม
Rabid

สวัสดี Rabid.what คุณพูดว่าจะมีวิธีการใด ๆ โดยการเข้าถึง R.drawable. ทรัพยากรมูลค่าโดยผ่าน resouce
Aswan

ฉันต้องการค่าจำนวนเต็มโดยผ่าน resourcename แบบไดนามิก
อัสวาน

ขอบคุณเช่นนี้ฉันต้องการและฉันต้องการที่จะได้รับทรัพยากรที่สามารถวาดได้ id.how ฉันจะไปมัน
อัสวาน

341

ถ้าผมเข้าใจถูกต้องนี้คือสิ่งที่คุณต้องการ

int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName());

ที่ "นี่" เป็นกิจกรรมเขียนเพียงเพื่อชี้แจง

ในกรณีที่คุณต้องการ String ใน strings.xml หรือตัวระบุขององค์ประกอบ UI ให้แทนที่ "drawable"

int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName());

ฉันเตือนคุณว่าวิธีการรับตัวระบุนี้ช้าจริง ๆ ใช้เฉพาะเมื่อจำเป็นเท่านั้น

เชื่อมโยงไปยังเอกสารอย่างเป็นทางการ: Resources.getIdentifier (ชื่อ String, String defType, String defPackage)


3
สิ่งนี้มีประโยชน์มากในบริบทของการเขียนการทดสอบเพื่อให้แน่ใจว่ามีสตริงบางอย่างหรืออื่น ๆ
Ehtesh Choudhury

1
ฉันไม่รู้จักผู้ชายฉันเพิ่ม Log ก่อนและหลัง getIdentifier () พร้อม timestamp และมันแสดงให้ฉันเห็นว่ามันถูกประมวลผลใน 0 - 1 ms! ดังนั้นมันไม่ช้ามันเร็วสุด ๆ ! ฉันใช้มันเพื่อรับภาพจากแหล่งข้อมูลและทำงานได้อย่างสมบูรณ์ ทดสอบบน Nexus5x
คิริลล์ Karmazin

1
@ KirillKarmazin: Nexus5X เป็นโทรศัพท์ที่เร็วพอสมควรและ 1ms สำหรับการโทรดังกล่าวค่อนข้างช้า จำไว้ว่าแต่ละเฟรม UI นั้นมีเพียง 16ms
มอเป็ด

วิกิพีเดียกล่าวว่า Kotlin ปรากฏตัวครั้งแรกในปี 2011 วิธีที่คุณสามารถตอบคำถามเกี่ยวกับเรื่องนี้ในปี 2010
Abhinav Chauhan


15

Kotlin Versionผ่านExtension Function

หากต้องการค้นหา id ทรัพยากรตามชื่อใน Kotlin ให้เพิ่มตัวอย่างด้านล่างในไฟล์ kotlin:

ExtensionFunctions.kt

import android.content.Context
import android.content.res.Resources

fun Context.resIdByName(resIdName: String?, resType: String): Int {
    resIdName?.let {
        return resources.getIdentifier(it, resType, packageName)
    }
    throw Resources.NotFoundException()
}


Usage

ตอนนี้สิ่งที่รหัสทรัพยากรที่สามารถเข้าถึงได้ทุกที่ที่คุณมีการอ้างอิงบริบทโดยใช้resIdByNameวิธีการ:

val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.    

วิกิพีเดียกล่าวว่า Kotlin ปรากฏตัวครั้งแรกในปี 2011 คุณสามารถโปรดบอกฉันว่าคำถามนี้ถูกถามในปี 2010 และได้รับการประกาศให้หุ่นยนต์ใน 2019 เป็นวิธีการที่เขาถามคำถามหุ่นยนต์ Kotlin ในปี 2010
Abhinav Chauhan

14

วิธีง่ายๆในการรับ ID ทรัพยากรจากสตริง นี่ ResourceName เป็นชื่อของ ImageView ทรัพยากรในโฟลเดอร์ drawable ซึ่งจะรวมอยู่ในไฟล์ 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);

6

ฉันขอแนะนำให้คุณใช้วิธีการรับรหัสทรัพยากร มันมีประสิทธิภาพมากกว่าการใช้วิธี getIdentidier () ซึ่งช้า

นี่คือรหัส:

/**
 * @author Lonkly
 * @param variableName - name of drawable, e.g R.drawable.<b>image</b>
 * @param с - class of resource, e.g R.drawable.class or R.raw.class
 * @return integer id of resource
 */
public static int getResId(String variableName, Class<?> с) {

    Field field = null;
    int resId = 0;
    try {
        field = с.getField(variableName);
        try {
            resId = field.getInt(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return resId;

}

มันจะไม่ทำงานในทุกกรณี ตัวอย่างเช่นถ้าคุณมี <string name = "string.name"> เนื้อหา </string> กว่าคลาส R.string จะมีฟิลด์ string_name และวิธีการของคุณจะไม่ทำงานในจุดนี้
ddmytrenko

3
ด้วยวิธีการของคุณไม่เร็วจริง เนื่องจากการทำให้เป็นคลาส Java ไม่ทำงานอย่างรวดเร็ว
ddmytrenko

5
// image from res/drawable
    int resID = getResources().getIdentifier("my_image", 
            "drawable", getPackageName());
// view
    int resID = getResources().getIdentifier("my_resource", 
            "id", getPackageName());

// string
    int resID = getResources().getIdentifier("my_string", 
            "string", getPackageName());

0

ฉันพบว่าคลาสนี้มีประโยชน์มากในการจัดการกับทรัพยากร มันมีวิธีการบางอย่างที่กำหนดไว้เพื่อจัดการกับ dimens, สี, drawable และสตริงเช่นนี้

public static String getString(Context context, String stringId) {
    int sid = getStringId(context, stringId);
    if (sid > 0) {
        return context.getResources().getString(sid);
    } else {
        return "";
    }
}

wikipedia บอกว่า kotlin ปรากฏตัวครั้งแรกในปี 2011 คุณช่วยบอกฉันได้ไหมว่าคำถามนี้ถูกถามในปี 2010 อย่างไรและได้รับการประกาศสำหรับ Android ในปี 2019 แล้วเขาถามคำถาม kotlin android ในปี 2010 ได้อย่างไร
Abhinav Chauhan

0

นอกเหนือไปจากการแก้ปัญหา @lonkly

  1. ดูภาพสะท้อนและการเข้าถึงฟิลด์
  2. ตัวแปรที่ไม่จำเป็น

วิธี:

/**
 * lookup a resource id by field name in static R.class 
 * 
 * @author - ceph3us
 * @param variableName - name of drawable, e.g R.drawable.<b>image</b>
 * @param с            - class of resource, e.g R.drawable.class or R.raw.class
 * @return integer id of resource
 */
public static int getResId(String variableName, Class<?> с)
                     throws android.content.res.Resources.NotFoundException {
    try {
        // lookup field in class 
        java.lang.reflect.Field field = с.getField(variableName);
        // always set access when using reflections  
        // preventing IllegalAccessException   
        field.setAccessible(true);
        // we can use here also Field.get() and do a cast 
        // receiver reference is null as it's static field 
        return field.getInt(null);
    } catch (Exception e) {
        // rethrow as not found ex
        throw new Resources.NotFoundException(e.getMessage());
    }
}

wikipedia บอกว่า kotlin ปรากฏตัวครั้งแรกในปี 2011 คุณช่วยบอกฉันได้ไหมว่าคำถามนี้ถูกถามในปี 2010 อย่างไรและได้รับการประกาศสำหรับ Android ในปี 2019 แล้วเขาถามคำถาม kotlin android ในปี 2010 ได้อย่างไร
Abhinav Chauhan

0

ใน Kotlin ทำงานต่อไปได้ดีสำหรับฉัน:

val id = resources.getIdentifier("your_resource_name", "drawable", context?.getPackageName())

หากทรัพยากรอยู่ในโฟลเดอร์ mipmap คุณสามารถใช้พารามิเตอร์ "mipmap" แทน "drawable"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.