728x90
반응형

https://stackoverflow.com/questions/64158273/what-does-getresources-getidentifier-do-in-android

 

What does getResources().getIdentifier() do in android?

I'm trying to create an app which plays a song with the name same as the button name. then I came across this answer which used the command in the question. I want to know what the command actually...

stackoverflow.com

이 포스트를 참조했습니다.

 

어떠한 view에 동적으로 이미지를 변경시키고 싶다면 view.setBackground(R.drawable.리소스 ID)를 사용하면된다.

view.setBackgroundResource(R.drawable.리소스 ID)

 

이때 어떠한 view가 버튼뷰이든 텍스트뷰든 이미지 뷰든 view의 개수가 매우 많고 이 view들이 동적으로 변해야한다면 if문과 for문으로 처리할 것이다.

 

물론 context.getresources().getidentifier()를 사용하는것 보다 view.setBackground(resourceID)를 직접 수행하는게 더 좋다.

 

여기 리소스 ID 번호를 넣는 리스트가 있다

ArrayList<Intger> mResList

리스트의 어디부터 어디까지는 버튼뷰, 어디부터 어디까지는 다른 뷰 로 지정해서 한번에 동적으로 변경시키려할 때 각 리소스 번호들을 찾아서 리스트에 넣는다고 하자

 

mResList.add(mContext.getResources().getIdentifier(itemID, "drawable", mContext.getPackageName()));

이 구문은 어떠한 itemID를 가진 String 문자열을 drawable 문서에서 찾아서 리소스 ID 번호를 구하고 리스트에 추가하라 라는 구문이다.

 

이렇게 리스트를 설정하고 특정 조건으로 뷰들의 이미지를 변경할 때는 다음과 같이 for문을 지정하면 된다.

for(int i = 0; i < mResList.size(); i++)
{
	view.setBackgroundResource(mResList.get(i));
}

 

기본적으로 context.getResources().getIdentifier() 를 사용하는건 권장하지 않는다.

왜냐하면 Android는 컴파일 시간에 리소스가 사용되고 있는지 알 수 없기 때문에 릴리스 빌드에서 코드를 난독화/최소화할 때 잠재적으로 제거될 수 있기 때문인데 이러한 경우 해당 구문이 컴파일할 때 제거되지 않도록 유지하려면 proguard 규칙을 추가해야한다.

 

만약 proguard 없어도 앱 크기가 작다면 난독화 규칙을 없애도 된다.

728x90
반응형

+ Recent posts