سؤال

لماذا أحصل على هذا الاستثناء؟

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;
هل كانت مفيدة؟

المحلول

يجب أن يكون معرف العلامة فريدًا ، لذا فهو يريد أن يكون معرفًا تم إنشاؤه في ملف الموارد لضمان التفرد.

إذا كان العرض سيحتوي فقط على علامة واحدة على الرغم من أنه يمكنك القيام بذلك فقط

setTag(objContact.onlineid);

نصائح أخرى

السبب في أنك غير قادر على استخدام SETTAG (int ، الكائن) هو أن Android يتطلب معرفًا فريدًا مسبقًا في وسيطة "int".

حاول إنشاء اثنين من الإدخال الفريد في String.xml XML قل ، "FirstName" و "SecondName" واستخدمهما على النحو التالي

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

لقد تأخرت قليلاً عن الحفلة ، لكنني عثرت على هذه المشكلة بنفسي اليوم واعتقدت أنني سأصدر إجابة أيضًا. ستكون هذه الإجابة قليلاً من مجموعة الإجابات الأخرى ، ولكن مع تطور. بادئ ذي بدء ، لا يمكن أن يكون المعرف ، كما أشار الآخرون ، محددًا ثابتًا في الكود الخاص بك (مثل Final Static Final Myid = 123) أو أي int آخر تحدده كحقل في مكان ما.

يجب أن يكون المعرف معرفًا فريدًا مسبقًا ، تمامًا مثل تلك التي تحصل عليها للسلاسل التي تضعها في القيم/الأوتار. xml (أي r.string.mystring). تشير إلى http://developer.android.com/guide/topics/resources/available-resources.html و http://developer.android.com/guide/topics/resources/more-resources.html للمزيد من المعلومات.

اقتراحي هو أن تقوم بإنشاء ملف جديد يسمى القيم/Tags.xml واكتب:

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

أعتقد أنه من الأفضل إنشاء ملف منفصل بدلاً من وضعه في Strings.xml كما اقترح Etiennesky.

هذا سيفعل المهمة ...

إذا كان لديك فقط 1 Settag في صفك ، فيمكنك استخدام أي int ، وربما النهائي الثابت المعلن في الأعلى.

تأتي المشكلة عندما كان لديك 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 أو غير المرتبط بأي حزمة سيؤدي إلى إلقاء نظرة غير قانونية.

من المصدر:

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"/>

السبب في أنك تريد حفظ القيمة حسب المعرف هو أنك تريد تغطية أكثر من قيمة واحدة في هذه العلامة ، أليس كذلك؟
هنا حل أكثر بساطة:
دعنا نقول أنك تريد حفظ قيمتين (سلاسل) في هذه العلامة: "FirstName" و "LastName". يمكنك حفظهما في سلسلة واحدة ، مفصولة بواسطة Semicolon:

v.setTag(firstname + ";" + lastname);

... والوصول إليها عن طريق تقسيمها إلى مجموعة سلسلة:

String[] data = v.getTag().toString().split(";");
System.out.println(data[0]) //firstname
System.out.println(data[1]) //lastname

هذا يعمل بالنسبة لي:

setTag(0xffffffff,objContact.onlineid);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top