Android 자원 id 상세 및 동적 가져오기
우리가 평소에 자원을 얻는 것은findViewById 방법을 통해 이루어진다. 예를 들어 우리는 항상 onCreate 방법에서 이런 문장을 사용한다.
btnChecked=(ImageView)findViewById(R.id.imgCheck);
findViewById는 layout에서 버튼, 탭, ListView, ImageView 등 다양한 View 대상을 얻을 수 있는 편리한 방법입니다.말 그대로 int 매개 변수: 자원 id가 필요합니다.자원 id는 매우 유용합니다.Android는 res 디렉터리에 있는 모든 자원에 id를 자동으로 분배합니다. 각종 그림 파일, xml문의'@+id'대상을 포함합니다.res의 하위 디렉터리는 거의 항상 고정되어 있습니다. 예를 들어 매번 볼 수 있는 것:drawable-xxx,layout,values, 그리고 흔치 않은 것:anim,xml,row,color입니다.
Android 교과서에서 다음과 같이 설명합니다.
res/drawable/그림 파일 저장하기;
res/layout/레이아웃 정의 파일 저장하기;
res/values/변수, 파라미터 등 파일을 저장하는 데 사용됩니다.
이것은 모두 우리가 이미 알고 있는 것이다.그 밖에 Android는 res 디렉터리에 있는 모든 자원에 id를 분배하는데 그 주요 분배 원칙은 다음과 같다.
drawable의 그림 파일은 항상 파일마다 자원 id입니다.
Xml 파일에서android:id='@+id/xxx'를 사용하는view마다 사용되지 않는 자원 id가 분배됩니다.
다른 더 복잡한 규칙은 아마도 모든 사람이 보충할 것이다.
ADK의 API 중 많은 방법이 사실 자원 id를 매개 변수로 사용합니다.
예를 들어 getDrawable 방법:
getResources().getDrawable(R.drawable.sendsms_bk));
글로 볼 때, get Resouces 방법은android를 되돌려줍니다.content.res. Resources 객체입니다.getDrawalbe 방법은 Drawable 대상을 되돌려줍니다. 이것은 그림이라는 것을 알고 있습니다.
getDrawable 방법에 사용되는 매개 변수는 자원 id입니다.
그러나 이 int형 자원 id는 도대체 어떤 숫자입니까?아니면 다 어디에 두든지.만약 세심하다면, gen 디렉터리의 R.Java 파일에서 그것들을 찾을 수 있습니다.모든 16진 정형 id는 O-O의 속성 이름이 있습니다. 이것들은 모두publicstaticfinal입니다. 수동으로 수정하지 마십시오.이러한 자원 id는 서로 다른 차원 구조에 위치하고 있다. 자세히 보면 그 중의 일부 규칙을 발견할 수 있다. 예를 들어drawable류에 포함된 자원 id는 사실res/drawable 디렉터리의 그림 파일을 대표한다.layout 클래스에 포함된 자원 id는 사실res/layout 디렉터리에 있는 xml 파일을 대표합니다.id 클래스에 포함된 자원 id는 레이아웃 xml 파일에android:id='@+id/xxx'를 사용하는widget 대상을 나타냅니다. 물론'@+Tyre/xx'를 사용한다면 Android가 컴파일할 때 R.java에서 Tyre라는 클래스를 만듭니다.
위의 이해를 통해 우리는 자원 id가'R.'로 시작하는 변수나 속성이라는 것을 발견했다. 왜냐하면 이것은 모두 R류에 정의되어 있기 때문이다.R은 동일한 R이 아니며 동일한 패키지 계층에 있지 않습니다.전자는android 프레임워크 자신의 자원을 정의했다. 예를 들어android.R.layout.simple_expandable_list_item_1、android.R.layout.simple_expandable_list_item_이.이 자원들을 당신은 사용한 적이 있습니까?시간이 있으면 한번 해 봐도 무방하다.또 다른 R은 바로 우리 자신의 R이다. 우리 자신의 자원 id를 정의했다.우리는 대상을 대상으로 하는 R.xxx를 사용할 수 있다.yyy의 방식은 자원 id를 사용합니다. 물론 16진수로 직접 사용할 수도 있습니다.
자원 id는 안드로이드에서 이렇게 중요하기 때문에 우리는 자원 id를 얻기만 하면 자원을 얻을 수 있다.어떤 경우, 우리는 자원 id로 상수를 사용할 수 없기 때문에 (변수로 대체하고 싶기 때문에) 두 가지 방식으로 자원 id를 동적으로 얻을 수 있습니다.
1. 반사
자바의 반사는 이렇게 강해서 우리는 막다른 골목에 처했을 때 항상 그것을 생각한다.코드를 살펴보겠습니다.
try{
Field field=R.drawable.class.getField(type);
int i= field.getInt(new R.drawable());
Log.d(tag,i+"");
return i;
}catch(Exception e){
Log.e(tag,e.toString());
return R.drawable.unknow;
}
type은 변수입니다. 그의 가능한 값은'close','edit','icon'등입니다.우리는 자바의 반사 클래스 필드를 통해 R.drawable 클래스 아래의 어떤 필드에 접근합니다.실제로 R.drawable 아래의 필드가 res.drawable-xxx 디렉터리에 있는 그림 파일의 자원 id라는 것을 알고 있습니다.따라서 위의 이 코드를 실행하는 것은 문자열을 통해 그림 파일에 대응하는 자원 id를 가져오는 것입니다.예를 들어 type의 값이 "icon"일 때, 위의 코드는res.drawable-xxx 디렉터리에 있는 icon을 얻을 수 있습니다.png 그림 파일의 자원 id를 우리에게 되돌려줍니다.우리가 자원 id를 통해 그림을 ImageView에 표시하는 것은 순조로운 일이다.2. Resources 클래스의 getIdentifier 방법 사용
반사 사용은 아무래도 번거롭다.같은 일을 안드로이드로 하면.content.res. Resources 클래스에서 하는 말은 두 마디입니다.
Resources res=getResources();
return res.getIdentifier(type,"drawable",getPackageName());
get Resources 방법은 contenxt (즉 Activity 클래스) 에서 나온 것으로 Resouces 대상을 직접 되돌려줍니다.Resouces의 getidentifier 방법은 R.java의 모든 자원 id를 되돌려줍니다. 물론, 필드 이름, 클래스 이름, 패키지 이름 세 개의 인자를 지정해야 합니다.패키지 이름이 지정한 패키지 이름 부분, R의 전체 이름이 android일 경우.R 또는 com.company.R, 가방 이름은 여기서'android'나'com.company'입니다.getPackageName은 사실 이것입니다.getPackageName (), 이 클래스의 패키지 이름을 직접 되돌려줍니다.클래스 이름은 자원에 속하는 클래스입니다.예를 들어 우리가 알고 있는 R.java 클래스 중의 몇 가지 고정된 클래스:drawable, id,string,layout 등은 그 아래에 많은 자원 id를 정의했다.
필드 이름은 자원 id의 이름입니다.예를 들어 이 자원 id 정의:
public static final int del=0x7f020002;
del은 자원 id의 이름입니다. 0x7f020002는 16진수입니다.3개의 매개 변수를 통해 getidentifier 방법은 비교적 동적인 방식으로 자원 id를 얻을 수 있습니다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.