Làm thế nào để có được một id tài nguyên với một tên tài nguyên đã biết?


178

Tôi muốn truy cập tài nguyên như Chuỗi hoặc Drawable bằng tên của nó chứ không phải int id của nó.

Phương pháp nào tôi sẽ sử dụng cho việc này?



wikipedia cho biết kotlin xuất hiện lần đầu tiên vào năm 2011, làm thế nào bạn có thể đặt câu hỏi về năm 2010
Abhinav Chauhan

Câu trả lời:


149

Nó sẽ giống như:

R.drawable.resourcename

Hãy chắc chắn rằng bạn không có Android.Rkhông gian tên được nhập vì nó có thể gây nhầm lẫn với Eclipse (nếu đó là những gì bạn đang sử dụng).

Nếu điều đó không hiệu quả, bạn luôn có thể sử dụng getResourcesphương thức của bối cảnh ...

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

Trong trường hợp this.contextđược intialised như một Activity, Servicehoặc bất kỳ khác Contextlớp.

Cập nhật:

Nếu đó là tên bạn muốn, Resourceslớp (được trả về getResources()) có một getResourceName(int)phương thức và a getResourceTypeName(int)?

Cập nhật 2 :

Các Resourceslớp học có phương pháp này:

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

Trả về số nguyên của tên, loại & gói tài nguyên đã chỉ định.


Cảm ơn bạn đã trả lời .R.drawable.resourcename tôi đang sử dụng bây giờ tôi cần lấy giá trị số nguyên của nó bằng cách chuyển tên resourcename
Aswan

2
R.drawable.resourcename số nguyên.
Bệnh dại

Xin chào Rabid. Bạn đã nói rằng có cách nào bằng cách truy cập R.drawable .resource giá trị bằng cách chuyển lại
Aswan

tôi cần giá trị số nguyên đó bằng cách chuyển động tên mã lại
Aswan

Thankq như thế này tôi muốn và tôi muốn có được tài nguyên có thể rút ra được. Làm thế nào tôi sẽ làm điều đó
Aswan

340

Nếu tôi hiểu đúng, đây là những gì bạn muốn

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

Trong đó "đây" là một Hoạt động, được viết chỉ để làm rõ.

Trong trường hợp bạn muốn có một chuỗi trong String.xml hoặc mã định danh của một thành phần UI, hãy thay thế "drawable"

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

Tôi cảnh báo bạn, cách lấy số nhận dạng này thực sự rất chậm, chỉ sử dụng khi cần thiết.

Liên kết đến tài liệu chính thức: Resources.getIdentifier (Tên chuỗi, String defType, String defPackage)


3
Điều này khá hữu ích trong bối cảnh kiểm tra viết để đảm bảo các chuỗi nhất định tồn tại hoặc v.v.
Ehtesh Choudhury

1
Tôi không biết người đàn ông, tôi đã thêm Nhật ký trước và sau getIdentifier () với dấu thời gian và nó cho tôi thấy rằng nó được thực thi trong 0 - 1 ms! Vì vậy, nó không chậm, nó siêu nhanh! Tôi đang sử dụng nó để lấy hình ảnh từ các tài nguyên và nó hoạt động hoàn hảo. Đã thử nghiệm trên Nexus5x.
Kirill Karmazin

1
@KirillKarmazin: Nexus5X là một điện thoại nhanh chóng và 1ms cho một cuộc gọi như vậy là khá chậm. Hãy nhớ rằng mỗi khung UI chỉ 16ms.
Vịt Mooing

wikipedia cho biết kotlin xuất hiện lần đầu tiên vào năm 2011, làm thế nào bạn có thể trả lời một câu hỏi về nó vào năm 2010
Abhinav Chauhan

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

15

Kotlin Versionthông quaExtension Function

Để tìm id tài nguyên theo tên của nó Trong Kotlin, hãy thêm đoạn mã bên dưới vào tệp kotlin:

Tiện ích mở rộng.kt.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

Bây giờ tất cả các id tài nguyên có thể truy cập bất cứ nơi nào bạn có tham chiếu ngữ cảnh bằng resIdByNamephương thức:

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

wikipedia cho biết kotlin xuất hiện lần đầu tiên vào năm 2011, bạn có thể vui lòng cho tôi biết câu hỏi này đã được hỏi vào năm 2010 như thế nào không và nó đã được tuyên bố cho Android vào năm 2019, anh ấy đã hỏi câu hỏi về kotlin android vào năm 2010
Abhinav Chauhan

14

Một cách đơn giản để lấy ID tài nguyên từ chuỗi. Ở đây resourceName là tên của ImageView tài nguyên trong thư mục drawable cũng được bao gồm trong tệp 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

Tôi sẽ đề nghị bạn sử dụng phương pháp của tôi để lấy ID tài nguyên. Nó hiệu quả hơn nhiều so với sử dụng phương thức getIdentidier (), chậm.

Đây là mã:

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

}

Nó sẽ không hoạt động cho tất cả các trường hợp. Ví dụ: nếu bạn có <string name = "string.name"> nội dung </ string> thì lớp R. String sẽ có trường string_name. Và phương pháp của bạn sẽ không hoạt động trong thời điểm này.
ddmytrenko

3
Ngoài ra phương pháp của bạn không thực sự nhanh. Bởi vì tuần tự hóa lớp Java không bao giờ hoạt động nhanh.
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

Tôi đã tìm thấy lớp này rất hữu ích để xử lý với các tài nguyên. Nó có một số phương thức được xác định để xử lý các độ mờ, màu sắc, hình vẽ và chuỗi, như phương pháp này:

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

wikipedia cho biết kotlin xuất hiện lần đầu tiên vào năm 2011, bạn có thể vui lòng cho tôi biết câu hỏi này đã được hỏi như thế nào vào năm 2010 và nó đã được tuyên bố cho Android vào năm 2019, làm thế nào anh ấy hỏi câu hỏi kotlin android vào năm 2010
Abhinav Chauhan

0

ngoài giải pháp @lonkly

  1. xem phản ánh và khả năng tiếp cận trường
  2. các biến không cần thiết

phương pháp:

/**
 * 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 cho biết kotlin xuất hiện lần đầu tiên vào năm 2011, bạn có thể vui lòng cho tôi biết câu hỏi này đã được hỏi như thế nào vào năm 2010 và nó đã được tuyên bố cho Android vào năm 2019, làm thế nào anh ấy hỏi câu hỏi kotlin android vào năm 2010
Abhinav Chauhan

0

Trong Kotlin sau đây hoạt động tốt cho tôi:

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

Nếu tài nguyên được đặt trong thư mục mipmap, bạn có thể sử dụng tham số "mipmap" thay vì "drawable".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.