프로그래밍 방식으로 뷰에 ID를 할당하려면 어떻게해야합니까?
XML 파일에서 뷰에 ID를 할당 한
android:id="@+id/something"
다음을 호출
findViewById()
할 수 있지만 프로그래밍 방식으로 뷰를 생성 할 때 ID를 어떻게 할당합니까?
setId()
기본 과제와 같지 않다고 생각 합니다.
setId()
여분입니다.아무도 나를 고칠 수 있습니까?
안드로이드 id
개요
Android
id
는 일반적으로 뷰를 식별하는 데 사용되는 정수입니다. 이것은
id
XML (수) 및 코드를 통해 통해 할당 될 수있다 (프로그래밍). (가)
id
XML 정의 참조 얻기에 가장 유용
View
S 의해 생성을
Inflater
(예로서 사용하여
setContentView
).
id
통해 할당XML
- 뷰 에
android:id="@+id/
somename 속성을 추가하십시오"
. - 응용 프로그램이 빌드되면 코드에 사용할
android:id
수 있도록 고유 하게 할당됩니다int
. - " somename"(실제로 상수)을 사용하여 코드에서
android:id
의int
값을 참조하십시오R.id.
. - 이것은
int
빌드마다 변경 될 수 있으므로 package.name/ 에서 ID 를 복사하지 마십시오 . " somename" 만 사용하십시오 .gen/
R.java
R.id.
- (또한 XML을 생성 할 때는 in XML에
id
할당 된Preference
것이 사용되지 않습니다 .)Preference
View
id
프로그래밍 방식으로 코드를 통해 할당
- int를
id
사용하여 수동으로 설정someView.setId(
);
- 는
int
양수 여야하지만, 그렇지 않으면 당신이 원하는 무엇이든 할 수있다 arbitrary- (이이 무서운 경우 계속 읽어.) - 예를 들어, 항목을 나타내는 여러보기를 작성하고 번호를 매기면 항목 번호를 사용할 수 있습니다.
고유성 id
의
XML
-지정된id
s는 고유합니다.- 코드 할당
id
들 할 수 없습니다 고유해야 - 코드 할당
id
과의 캔 (이론적으로) 충돌XML
-assignedid
의. - 이러한
id
쿼리는 올바르게 쿼리 된 경우 중요하지 않습니다 (계속 읽으십시오) .
언제 (그리고 왜) 충돌 id
하는 것이 중요하지 않습니다
findViewById(int)
지정한 뷰에서 뷰 계층 구조 를 통해 깊이 우선 재귀를 반복View
하고 일치하는 첫 번째를 반환합니다id
.- 계층 구조에서
id
XML로 정의되기 전에 코드가 할당되지 않은 한 항상 XML 정의 뷰를 반환합니다 .id
findViewById(R.id.somename)
id
동적 뷰 및 할당 만들기 ID
들
- 레이아웃 XML에서로 빈
ViewGroup
을 정의하십시오id
.
- A와 같은
LinearLayout
과android:id="@+id/placeholder"
. - 자리 표시 자 채우기 위해 코드를 사용하여
ViewGroup
에View
들. - 필요하거나 원하는 경우
id
각보기에 편리한을 지정하십시오 . - placeholder.findViewById (convenientInt);를 사용하여 이러한 자식 뷰를 쿼리하십시오.
-
고유 ID를 생성 할 수있는 API 17이 도입되었습니다 .View.generateViewId()
뷰에 대한 참조를 유지하기로 선택한 경우 뷰
를 인스턴스화하고
getApplicationContext()
각 참조를 null로 설정해야합니다
onDestroy
. 분명히
새는
것
Activity
(파손 된 후 그 위에 매달려있는 것)은 낭비입니다 .. :)
android:id
코드에서 사용하기 위해 XML 예약
View.generateViewId()
고유 ID를 생성하는
API 17이 도입되었습니다 . (이 점을 지적한 변경 기회를 가져 주셔서 감사합니다.) *
ViewGroup
XML을 통해 정의 할 수없는 경우 (또는 원하지 않는 경우) XML을 통해 ID를 예약하여 고유 한 상태로 유지할 수 있습니다.
여기에서 values / ids.xml 은 사용자 정의를 정의합니다 id
.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="reservedNamedId" type="id"/>
</resources>
그런 다음 ViewGroup 또는 View가 생성되면 맞춤 ID를 첨부 할 수 있습니다.
myViewGroup.setId(R.id.reservedNamedId);
충돌하는 id
예
모호한 예를 통해 명확성을 기하기 위해
id
장면 뒤에서 충돌 이있을 때 발생하는 상황을 살펴 보겠습니다 .
layout / mylayout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/placeholder"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
충돌을 시뮬레이션하기 위해 최신 빌드가 할당 말할 수 R.id.placeholder
( @+id/placeholder
)는 int
값을 12
..다음으로
MyActivity.java
는 프로그래밍 방식으로 코드를 통해 뷰를 추가합니다.
int placeholderId = R.id.placeholder; // placeholderId==12
// returns *placeholder* which has id==12:
ViewGroup placeholder = (ViewGroup)this.findViewById(placeholderId);
for (int i=0; i<20; i++){
TextView tv = new TextView(this.getApplicationContext());
// One new TextView will also be assigned an id==12:
tv.setId(i);
placeholder.addView(tv);
}
그래서
placeholder
우리의 새로운 하나
TextView
의 둘 모두가
id
12을! 그러나 자리 표시 자의 자식 뷰를 쿼리하는 경우 실제로 문제가되지 않습니다.
// Will return a generated TextView:
placeholder.findViewById(12);
// Whereas this will return the ViewGroup *placeholder*;
// as long as its R.id remains 12:
Activity.this.findViewById(12);
*그렇게 나쁘지 않다
당신은
View.setId(integer)
이것을 위해 사용할 수 있습니다 . XML에서는 문자열 ID를 설정하더라도 정수로 변환됩니다. 이로 인해
Views
프로그래밍 방식으로 추가 하는 모든 (정수) 정수를 사용할 수 있습니다 .
According to
View
documentationThe identifier does not have to be unique in this view's hierarchy. The identifier should be a positive number.
So you can use any positive integer you like, but in this case there can be some views with equivalent id's. If you want to search for some view in hierarchy calling to setTag with some key objects may be handy.
Credits to this answer.
Yes, you can call setId(value)
in any view with any (positive) integer value that you like and then find it in the parent container using findViewById(value)
. Note that it is valid to call setId()
with the same value for different sibling views, but findViewById()
will return only the first one.
참고URL : https://stackoverflow.com/questions/8460680/how-can-i-assign-an-id-to-a-view-programmatically
'programing' 카테고리의 다른 글
Gson-Json에서 형식화 된 ArrayList로 변환 (0) | 2020.05.10 |
---|---|
예를 들어 메시지의 수신자 유형 ***는 전달 선언입니다. (0) | 2020.05.10 |
virtualenv를 활성화하는 방법? (0) | 2020.05.10 |
string.IsNullOrEmpty (string) vs. string.IsNullOrWhiteSpace (string) (0) | 2020.05.10 |
LESS를 사용하지 않고 부트 스트랩 탐색 모음 축소 중단 점 변경 (0) | 2020.05.10 |