Bagaimana cara mendapatkan id sumber daya dengan nama sumber daya yang dikenal?


178

Saya ingin mengakses sumber daya seperti String atau Drawable dengan namanya dan bukan int id.

Metode mana yang akan saya gunakan untuk ini?



wikipedia mengatakan kotlin pertama kali muncul pada tahun 2011, bagaimana Anda dapat mengajukan pertanyaan tentang tahun 2010
Abhinav Chauhan

Jawaban:


149

Ini akan menjadi sesuatu seperti:

R.drawable.resourcename

Pastikan Anda tidak memiliki Android.Rnamespace yang diimpor karena dapat membingungkan Eclipse (jika itu yang Anda gunakan).

Jika itu tidak berhasil, Anda selalu dapat menggunakan metode konteks getResources...

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

Di mana this.contextdiinternalisasi sebagai Activity, Serviceatau Contextsubkelas lainnya .

Memperbarui:

Jika itu nama yang Anda inginkan, Resourceskelas (dikembalikan oleh getResources()) memiliki getResourceName(int)metode, dan a getResourceTypeName(int)?

Pembaruan 2 :

The Resourceskelas memiliki metode ini:

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

Yang mengembalikan bilangan bulat dari nama sumber daya, tipe & paket yang ditentukan.


Terima kasih atas balasan Anda .R.drawable.resourcename yang saya gunakan sekarang, saya harus mendapatkan nilai integernya dengan melewati resourcename
Aswan

2
R.drawable.resourcename adalah bilangan bulat.
Rabid

Hai Rabid. Apa yang Anda katakan itu ada cara apa pun dengan mengakses R.drawable. Sumber nilai dengan melewati sumber daya
Aswan

saya butuh nilai integer dengan melewatkan resourcename secara dinamis
Aswan

Terima kasih seperti ini yang saya inginkan dan saya ingin mendapatkan id.how resource yang dapat ditarik
Aswan

340

Jika saya mengerti benar, ini yang Anda inginkan

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

Di mana "ini" adalah Kegiatan, ditulis hanya untuk memperjelas.

Jika Anda menginginkan sebuah String di strings.xml atau pengidentifikasi elemen UI, gantikan "drawable"

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

Saya memperingatkan Anda, cara mendapatkan pengenal ini sangat lambat, gunakan hanya jika diperlukan.

Tautan ke dokumentasi resmi: Resources.getIdentifier (Nama string, String defType, String defPackage)


3
Ini cukup berguna dalam konteks tes menulis untuk memastikan string tertentu ada atau dll.
Ehtesh Choudhury

1
Saya tidak tahu kawan, saya telah menambahkan Log sebelum dan sesudah getIdentifier () dengan timestamp dan itu menunjukkan kepada saya bahwa itu dijalankan dalam 0 - 1 ms! Jadi tidak lambat, ini sangat cepat! Saya menggunakannya untuk mendapatkan gambar dari sumber daya dan bekerja dengan sempurna. Diuji pada Nexus5x.
Kirill Karmazin

1
@ KirillKarmazin: Nexus5X adalah ponsel yang cukup cepat, dan 1 ms untuk panggilan seperti itu cukup lambat. Ingat bahwa setiap frame UI hanya 16ms.
Mooing Duck

wikipedia mengatakan kotlin pertama kali muncul pada 2011, bagaimana Anda bisa menjawab pertanyaan tentang hal itu pada 2010
Abhinav Chauhan

25
int resourceID = 
    this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());

15

Kotlin VersionviaExtension Function

Untuk menemukan id sumber daya dengan namanya Di Kotlin, tambahkan snippet di bawah ini di file 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

Sekarang semua id sumber daya dapat diakses di mana pun Anda memiliki referensi konteks menggunakan resIdByNamemetode:

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

wikipedia mengatakan kotlin pertama kali muncul pada tahun 2011, dapatkah Anda memberi tahu saya bagaimana pertanyaan ini ditanyakan pada tahun 2010, dan dinyatakan untuk android pada tahun 2019, bagaimana ia mengajukan pertanyaan android kotlin pada tahun 2010
Abhinav Chauhan

14

Cara sederhana untuk mendapatkan ID sumber daya dari string. Di sini resourceName adalah nama sumber daya ImageView di folder drawable yang termasuk dalam file XML juga.

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

Saya sarankan Anda menggunakan metode saya untuk mendapatkan ID sumber daya. Ini jauh lebih efisien, daripada menggunakan metode getIdentidier (), yang lambat.

Berikut kodenya:

/**
 * @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;

}

Ini tidak akan berfungsi untuk semua kasus. Misalnya, jika Anda memiliki <string name = "string.name"> konten </string> daripada kelas R.string akan memiliki bidang string_name. Dan metode Anda tidak akan berfungsi pada titik ini.
ddmytrenko

3
Metode Anda sebenarnya juga tidak cepat. Karena serialisasi kelas Java tidak pernah berfungsi dengan cepat.
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

Saya merasa kelas ini sangat membantu untuk menangani sumber daya. Ini memiliki beberapa metode untuk menangani dimens, warna, drawable, dan string, seperti ini:

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

wikipedia mengatakan kotlin pertama kali muncul pada tahun 2011, dapatkah Anda memberi tahu saya bagaimana pertanyaan ini ditanyakan pada tahun 2010, dan dinyatakan untuk android pada tahun 2019, bagaimana ia mengajukan pertanyaan android kotlin pada tahun 2010
Abhinav Chauhan

0

selain solusi @lonkly

  1. lihat refleksi dan aksesibilitas lapangan
  2. variabel yang tidak perlu

metode:

/**
 * 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 mengatakan kotlin pertama kali muncul pada tahun 2011, dapatkah Anda memberi tahu saya bagaimana pertanyaan ini ditanyakan pada tahun 2010, dan dinyatakan untuk android pada tahun 2019, bagaimana ia mengajukan pertanyaan android kotlin pada tahun 2010
Abhinav Chauhan

0

Di Kotlin berikut ini berfungsi dengan baik untuk saya:

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

Jika sumber daya ditempatkan di folder mipmap, Anda dapat menggunakan parameter "mipmap" alih-alih "drawable".

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.