키는 응용 프로그램 특정 자원 ID 여야합니다. 20:29:38.044: ERROR/AndroidRuntime(5453): java.lang.IllegalArgumentException: The key must be

이 예외가 발생하는 이유는 무엇입니까?

05-18 20:29:38.044: ERROR/AndroidRuntime(5453): java.lang.IllegalArgumentException: The key must be an application-specific resource id.
05-18 20:29:38.044: ERROR/AndroidRuntime(5453):     at android.view.View.setTag(View.java:7704)
05-18 20:29:38.044: ERROR/AndroidRuntime(5453):     at com.mypkg.viewP.inflateRow(viewP.java:518)

문제의 라인은 다음과 같습니다

((Button) row.findViewById(R.id.btnPickContact)).setTag(TAG_ONLINE_ID,objContact.onlineid);

나는 그것을 다음과 같이 정의했다.

private static final int TAG_ONLINE_ID = 1;



답변

태그 ID는 고유해야하므로 고유성을 보장하기 위해 자원 파일에서 작성된 ID가 되길 원합니다.

뷰에 태그가 하나만 포함되어 있다면

setTag(objContact.onlineid);


답변

setTag (int, Object)를 사용할 수없는 이유는 안드로이드가 ‘int’인수에 미리 컴파일 된 고유 ID를 요구하기 때문입니다.

String.xml xml에서 “firstname”& “secondname”이라는 두 개의 고유 한 항목을 만들어 아래처럼 사용하십시오.

imageView.setTag(R.string.firstname, "Abhishek");
imageView.setTag(R.string.lastname, "Gondalia");


답변

나는 파티에 조금 늦었지만 오늘이 문제에 걸려 넘어져서 답을 줄 것이라고 생각했다. 이 답변은 다른 답변을 약간 편집 한 것이지만 꼬인 것입니다. 우선, 다른 사람들이 지적한 것처럼 id는 코드 (예 : private static final int MYID = 123) 또는 필드로 정의하는 다른 int로 정의 된 상수가 될 수 없습니다.

id는 values ​​/ strings.xml에 넣은 문자열 (예 : R.string.mystring)과 마찬가지로 미리 컴파일 된 고유 ID 여야합니다. 자세한 내용은 http://developer.android.com/guide/topics/resources/available-resources.htmlhttp://developer.android.com/guide/topics/resources/more-resources.html 을 참조하십시오.

내 제안은 values ​​/ tags.xml이라는 새 파일을 만들고 다음과 같이 작성하는 것입니다.

    <resources xmlns:android="http://schemas.android.com/apk/res/android">
      <item name="TAG_ONLINE_ID" type="id"/>
    </resources>

EtienneSky가 제안한대로 strings.xml에 넣는 대신 별도의 파일을 만드는 것이 좋습니다.


답변

이 작업을 수행합니다 …

클래스에 1 개의 setTag 만 있으면 상단에 선언 된 정적 최종 결과를 사용할 수 있습니다.

다른 키를 가진 2 개 이상의 setTag가있을 때 문제가 발생합니다. 내말은:

public static final int KEY_1 = 1;
public static final int KEY_2 = 2;
...
setTag(KEY_1)
setTag(KEY_2)
...

그 시나리오는 잘못되었습니다. 그런 다음 다음과 같은 값으로 아마도 ids.xml이라는 값 파일을 추가해야합니다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="resourceDrawable" />
    <item type="id" name="imageURI" />
</resources>

그런 다음 수업 시간에 전화하십시오.

 ...
 setTag(R.id.resourceDrawable, KEY_1)
 setTag(R.id.imageURI, KEY_2)
 ...


답변

private static final int TAG_ONLINE_ID = 1 + 2 << 24;

작동해야합니다. ceph3us의 추가 정보 :

지정된 키는 Android 프레임 워크에 속하는 것으로 식별되거나 패키지와 연관되지 않은 고유 키인지 확인하려면 애플리케이션의 자원에서 선언 된 ID 여야합니다. IllegalArgumentException이 발생합니다.

출처에서 :

public void setTag(int key, final Object tag) {
    // If the package id is 0x00 or 0x01, it's either an undefined package
    // or a framework id
    if ((key >>> 24) < 2) {
        throw new IllegalArgumentException("The key must be an application-specific "
                + "resource id.");
    }

    setKeyedTag(key, tag);
}


답변

사용했습니다 viewHolder.itemTitleTextView.getId(). 그러나 당신은 또한 당신의 자원에서 선언 할 수 있습니다 :
<item type="id" name="conversation_thread_id"/>


답변

이것은 나를 위해 작동합니다 :

setTag(0xffffffff,objContact.onlineid);