[java] 안드로이드, 문자열에서 리소스 ID를 얻습니까?

내 클래스 중 하나의 메소드에 자원 ID를 전달해야합니다. 참조가 가리키는 id와 문자열이 필요합니다. 이것을 어떻게 가장 잘해야합니까?

예를 들면 다음과 같습니다.

R.drawable.icon

정수 ID를 가져와야하지만 “icon”문자열에 액세스해야합니다.

메소드에 전달해야하는 모든 것이 “아이콘”문자열이면 바람직합니다.



답변

@ EboMike : 나는 그것이 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()반사를 사용하는 것보다 느린 블로그 게시물을 발견했습니다 . 확인하십시오 .


답변

이 기능을 사용하여 리소스 ID를 얻을 수 있습니다.

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

따라서 이와 같이 drawable call 함수 를 얻으려면

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

문자열의 경우 다음과 같이 호출 할 수 있습니다

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

이것을 읽으십시오


답변

이것은 @Macarse 답변을 기반으로합니다.

이를 통해 리소스 ID를보다 빠르고 코드 친화적 인 방식으로 얻을 수 있습니다.

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);


답변

리소스 이름에서 응용 프로그램 리소스 ID 를 얻는 방법 은 매우 일반적이며 잘 대답하는 질문입니다.

리소스 이름에서 기본 Android 리소스 ID 를 얻는 방법에 대한 대답이 적습니다. 다음은 리소스 이름별로 Android 드로어 블 리소스를 얻는 솔루션입니다.

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);
    }
}

다른 유형의 자원에 액세스하도록 메소드를 수정할 수 있습니다.


답변

문자열과 int를 페어링 해야하는 경우 Map은 어떻습니까?

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);
}


답변

당신은 사용할 수 있습니다 Resources.getIdentifier()당신은 즉, 당신의 XML 파일에서 사용할로 문자열의 형식을 사용할 필요가 있지만, package:drawable/icon.


답변

나는 이것을 좋아했는데 그것은 나를 위해 일하고있다 :

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