이미지 이름을 알고있는 경우 이미지의 리소스 ID를 어떻게 얻습니까?


답변:


269

이런 식으로 :

String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());

10
덕분에 비슷한 문제에 대한 해결책을 찾을 수있었습니다. getResources().getIdentifier(name, "id", getPackageName());(R.id.name과 마찬가지로) ImageButton의 ID를 얻는 데 사용 합니다.
0r

42
드로어 블 이름에는 ".png"와 같은 확장자가 포함되어서는 안됩니다.
larham1

1
변수에 정확히 들어가는 것은 무엇 name입니까? 내가 알고있는 버튼의 ID를 찾고 싶습니다. 제 경우에는button1
John Watson

1
getResource()getPackageName()오류를 보여주는. cannot resolve method
Srujan Barai

@Srujan Barai getResource()getPackageName()Activity의 메소드입니다.
베르가

29

당신은 또한 이것을 시도 할 수 있습니다 :

try {
    Class res = R.drawable.class;
    Field field = res.getField("drawableName");
    int drawableId = field.getInt(null);
}
catch (Exception e) {
    Log.e("MyTag", "Failure to get drawable id.", e);
}

이 URL을 아래 URL에서 복사했습니다. 이 페이지에서 수행 된 테스트에 따르면 getIdentifier ()보다 5 배 빠릅니다. 또한 더 편리하고 사용하기 쉽다는 것을 알았습니다. 그것이 당신에게도 도움이되기를 바랍니다.

링크 : Android에서 동적으로 리소스 검색


2
이것은 더 빠를 수도 있지만 proguard를 사용하면 문제가 발생할 수 있습니다. 이것은 적어도 나를 위해 지키지 못했습니다
Pedro Rainho

일반적인 예외를 잡는 것은 특히 나쁜 생각입니다. 또한 드로어 블에 대한 단단한 참조가 없으면 Proguard는 어디에서나 사용중인 것으로 생각하지 않으므로 참조를 최적화 할 수 있습니다.
Paul Lammertsma

나는 지금 이해한다 :) 당신은 최적화하는 동안 drawableName 변경 사항과 리소스 가이 방법을 사용하여 찾을 수 없다는 것을 의미합니다. :)
VSB

1
@VSB : 마지막 댓글이 Paul Lammertsma 댓글 바로 위의 응답 인 경우 : 아니요, Proguard에서이 리소스에 대한 참조를 알지 못하므로 리소스가 사용되지 않는다고 생각하여 리소스를 제거 할 수 있습니다.
ToolmakerSteve

xxxxhdpi, xxhdpi 등을 사용하면이 방법의 유용성이 줄어 듭니다.
누군가 Somewhere Somewhere

11

퍼블릭 시스템 리소스의 예 :

// this will get id for android.R.drawable.ic_dialog_alert
int id = Resources.getSystem().getIdentifier("ic_dialog_alert", "drawable", "android");

경보

또 다른 방법은 android.R.drawable 클래스 의 설명서를 참조하는 것입니다 .


1
@Milaaaad 무슨 뜻인가요?
naXa

그것은 코드의 자원에 의해 혼란스러워하고 비 활동 클래스에서 사용한다는 것을 의미합니다
Milaaaad

1
@Milaaaad이 방법은 시스템 리소스를위한 것입니다. 문맥에 의존하지 않습니다.
naXa

10

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

public static int getResourseId(Context context, String pVariableName, String pResourcename, String pPackageName) throws RuntimeException {
    try {
        return context.getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
    } catch (Exception e) {
        throw new RuntimeException("Error getting Resource ID.", e)
    } 
}


따라서 Drawable Resource ID 를 얻으려면 다음 과 같이 메소드를 호출하십시오.

getResourseId(MyActivity.this, "myIcon", "drawable", getPackageName());

(또는 조각에서) :

getResourseId(getActivity(), "myIcon", "drawable", getActivity().getPackageName());


A의 문자열 리소스 ID는 다음과 같이 호출 할 수 있습니다 :

getResourseId(getActivity(), "myAppName", "string", getActivity().getPackageName());

기타...


주의 : 리소스 ID를 찾지 못하면 RuntimeException이 발생합니다. 프로덕션 환경에서 올바르게 복구하십시오.

이것을 읽으십시오


4
나는 그것을 제거해야한다고 생각합니다 . static그렇지 getResources()않으면 작동하지 않습니다.
Richard Le Mesurier

@Richard Le Mesurier, 왜 설명 할 수 있습니까? 감사합니다.
Veer

1
@ Leo.Han 그 의견을 말했을 때 Context사용할 수 없었습니다. 수정은 static그것을 제거 하고 Context(예를 들어 Activity또는 Application); 또는 대체 수정은 Jonathan이 편집에서 수행 한 작업 Context으로, 메소드 에 전달 하는 것입니다.
Richard Le Mesurier

1
@ 리차드 르 Mesurier, 나는 그것을 :) 수년 후 친절하게 답장을 보내 주셔서 감사합니다, 당신이 말한대로입니다, 지금 편집 기록을 확인
비어

0

내가 만난 다른 시나리오.

String imageName = "Hello"그런 다음 getIdentifier 함수에 첫 번째 인수로 전달되면 문자열 널 종료와 함께 이름을 전달하고 항상 0을 리턴합니다. 이 imageName.substring (0, imageName.length ()-1)을 전달하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.