programing

프로그래밍 방식으로 뷰에 ID를 할당하려면 어떻게해야합니까?

new-time 2020. 5. 10. 12:29
반응형

프로그래밍 방식으로 뷰에 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:idint값을 참조하십시오 R.id..
  • 이것은 int빌드마다 변경 될 수 있으므로 package.name/ 에서 ID복사하지 마십시오 . " somename" 만 사용하십시오 .gen/R.javaR.id.
  • (또한 XML을 생성 할 때는 in XML에 id할당 된 Preference것이 사용되지 않습니다 .)PreferenceView

id프로그래밍 방식으로 코드를 통해 할당

  • int를 id사용하여 수동으로 설정someView.setId();
  • int양수 여야하지만, 그렇지 않으면 당신이 원하는 무엇이든 할 수있다 arbitrary- (이이 무서운 경우 계속 읽어.)
  • 예를 들어, 항목을 나타내는 여러보기를 작성하고 번호를 매기면 항목 번호를 사용할 수 있습니다.

고유성 id

  • XML-지정된 ids는 고유합니다.
  • 코드 할당 id들 할 수 없습니다 고유해야
  • 코드 할당 id과의 캔 (이론적으로) 충돌 XML-assigned id의.
  • 이러한 id쿼리는 올바르게 쿼리 된 경우 중요하지 않습니다 (계속 읽으십시오) .

언제 (그리고 왜) 충돌 id하는 것이 중요하지 않습니다

  • findViewById(int)지정한 뷰에서 뷰 계층 구조 통해 깊이 우선 재귀를 반복 View하고 일치하는 첫 번째를 반환합니다 id.
  • 계층 구조에서 idXML로 정의되기 전에 코드가 할당되지 않은 한 항상 XML 정의 뷰를 반환합니다 .idfindViewById(R.id.somename)id

동적 뷰 및 할당 만들기 ID

    • 레이아웃 XML에서로 빈 ViewGroup정의하십시오 id.

  • A와 같은 LinearLayoutandroid:id="@+id/placeholder".
  • 자리 표시 자 채우기 위해 코드를 사용하여 ViewGroupView들.
  • 필요하거나 원하는 경우 id각보기에 편리한을 지정하십시오 .
  • placeholder.findViewById (convenientInt);를 사용하여 이러한 자식 뷰를 쿼리하십시오.
  • View.generateViewId()

    고유 ID를 생성 할 수있는 API 17이 도입되었습니다 .

뷰에 대한 참조를 유지하기로 선택한 경우 뷰

를 인스턴스화하고

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 documentation

The 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

반응형