কীটি অবশ্যই একটি অ্যাপ্লিকেশন-নির্দিষ্ট সংস্থান আইডি হতে হবে


145

আমি কেন এই ব্যতিক্রম পাব?

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;

উত্তর:


55

ট্যাগ আইডিটি অবশ্যই অনন্য হতে হবে তাই এটি অনন্যতার গ্যারান্টি হিসাবে এটি কোনও উত্স ফাইলে তৈরি আইডি হতে চায়।

আপনি যদি না করতে পারেন তবে দৃশ্যটিতে কেবলমাত্র একটি ট্যাগ থাকবে

setTag(objContact.onlineid);

3
আমি এখনও প্যাটার্ন পাই না। আমি একটি প্রথম এবং শেষ নাম বলতে অনুরূপ দুটি ট্যাগ সেট করতে চাই। আমি এইগুলির জন্য পূর্ণসংখ্যা আইডি কোথায় সংজ্ঞায়িত করব?
জেফ্রি ব্লাটম্যান

7
আপনি যে কোনও সংস্থান ব্যবহার করতে পারেন - এমনকি একটি এলোমেলো আর.আইডি.ফুও নিন যেখানে আপনার প্রকল্পে এফইও কিছু আইডি।
আর্টেম রাশাকোভস্কিই

16
এটি অনন্য ট্যাগ আইডি পাওয়ার সেরা উপায়? সত্যিই অ্যান্ড্রয়েড?
jimmy0251

আরে সেখানে, আমি জানি না যে কতগুলি ট্যাগ রয়েছে? কারণ আমি মডেলের কিছু ডেটা অনুসারে ভিউ জেনারেট করতে চাই ....
jsina

প্রশ্নকারীর সমস্যার সম্ভাব্য সমাধান, তবে এটি সেরা সমাধান নয়। উত্তর হিসাবে চিহ্নিত করা উচিত নয় ...
রাগ করুন আইটুই

226

আপনি সেটট্যাগ (ইন্টি, অবজেক্ট) ব্যবহার করতে পারছেন না তার কারণ হ'ল অ্যান্ড্রয়েডের 'ইনট' যুক্তিতে একটি প্রাক-সংকলিত অনন্য আইডি প্রয়োজন।

স্ট্রিং.এক্সএমএল এক্সএমএলতে দুটি অনন্য এন্ট্রি তৈরি করার চেষ্টা করুন, "প্রথম নাম" এবং "দ্বিতীয় নাম" বলুন এবং সেগুলি নীচের মত ব্যবহার করুন

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

129
R.id.TAG_ONLINE_ID: আপনার strings.xml ফাইলে এই অ্যাড: <আইটেমটি টাইপ = "ID" নাম = "TAG_ONLINE_ID" /> এবং আপনি একটি নিয়মিত আইডি রিসোর্স মত ব্যবহার করতে পারেন
EtienneSky

9
এই এক উত্তর হওয়া উচিত। এটি আরও জেনেরিক
আয়রন ব্লসম

2
@ অজিথমেমন কেন? অ্যাপ্লিকেশনটি সংকলিত হয়ে গেলে, স্ট্রিংস। এক্সএমএল ফাইল প্রতিটি উপাদানকে একটি অনন্য আন্ত সংস্থানীয় আইডি বরাদ্দ করে। স্ট্রিং উপাদানটির মান বিবেচিত হয় না।
ataulm

1
আপনাকে ধন্যবাদ, এটি এত দুর্দান্ত এবং সহায়ক ... আপনি যদি ট্যাগটি পেতে চান তবে v.getTag (আর। স্ট্রিং.নাম)
স্টাঙ্কের

5
উন্নত একটি ফাইল তৈরি ids.xml মধ্যে মাঝামাঝি / মান ডিরেক্টরি ও সেখানে আপনার সব অনন্য আইডি যোগ করুন।
ভোভোস্ট

146

আমি পার্টিতে কিছুটা দেরি করেছিলাম তবে আমি নিজেই আজ এই সমস্যায় হোঁচট খেয়েছি এবং ভেবেছিলাম আমিও উত্তর দেব। এই উত্তরটি অন্যান্য উত্তরগুলির সংকলন কিছুটা হলেও মোচড় দিয়ে থাকবে। প্রথমত, আইডি, যেমন অন্যরা নির্দেশ করেছে, আপনার কোডে স্থির সংজ্ঞায়িত হতে পারে না (যেমন প্রাইভেট স্ট্যাটিক ফাইনাল ইন এমআইআইডি = 123) বা অন্য কোথাও যা আপনি ক্ষেত্র হিসাবে সংজ্ঞায়িত করেছেন int

আপনি মান / স্ট্রিং.এক্সএমএল (অর্থাত্ আর। স্ট্রিং.মাইস্ট্রিং) এ রেখেছেন এমন স্ট্রিংয়ের জন্য যে আইডিটি পেয়েছেন ঠিক তেমন আইডিকে একটি প্রাকম্পম্পাইল্ড ইউনিক আইডি হতে হবে। পড়ুন http://developer.android.com/guide/topics/resources/available-resources.html এবং http://developer.android.com/guide/topics/resources/more-resources.html আরও তথ্যের জন্য।

আমার পরামর্শ হ'ল আপনি মান / ট্যাগ.এসএমএল নামে একটি নতুন ফাইল তৈরি করুন এবং লিখুন:

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

আমি মনে করি ইটিয়েনস্কির পরামর্শ অনুসারে স্ট্রিংস.এক্সএমএল স্থাপনের পরিবর্তে একটি পৃথক ফাইল তৈরি করা ভাল।


14
এমনকি আপনি এটি <item name="TAG_ONLINE_ID" type="id"/>সরল করতে পারেন।
বেনোইট ডাফেজ

এটিই আসল সমাধান; নবাগত নয় "আমি কী করছি তা বুঝতে পারি না তবে এই হ্যাকটি কাজ করে"
রোল

নোট, কোড ব্যবহার করা অ্যাক্সেস করতে R.id..., এবং না R.string.. বাR.tags...
g2server

এই কাজের ছিল এবং এখানে অন্য একটা পোস্টে যেখানে তার ব্যবহার দেখায়: stackoverflow.com/questions/28492493/...
prasad_

এবং নিশ্চিত করুন যে আপনি ফাইলটি এক্সএমএল ফোল্ডারে নয় মানগুলিতে রেখেছেন। :)
ন্যান্টোকা

55

এই কাজটি করবেন ...

আপনার ক্লাসে যদি কেবলমাত্র 1 সেটট্যাগ থাকে তবে আপনি যে কোনও ইনট ব্যবহার করতে পারেন, সম্ভবত স্থির চূড়ান্তটিকে শীর্ষে ঘোষণা করা হয়েছে।

সমস্যাটি তখন আসে যখন আপনার কাছে বিভিন্ন কীগুলির সাথে 2 বা ততোধিক সেটট্যাগ রয়েছে। আমি বোঝাতে চাই:

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

সেই দৃশ্যটি ভুল। তারপরে আপনাকে নিম্নলিখিতগুলির সাথে সম্ভবত আইডস.এক্সএমএল নামে একটি মান ফাইল যুক্ত করতে হবে:

<?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)
 ...

নতুনদের জন্য সেরা ব্যাখ্যা
রিচার্ড লে ম্যাসুরিয়ার

এটিই আসল সমাধান: নবাগত হ্যাক ফিক্স নয়!
রোল

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

কাজ করা উচিত. Ceph3us থেকে আরও তথ্য :

নির্দিষ্ট কীটি অ্যান্ড্রয়েড কাঠামোর সাথে সম্পর্কিত বা কোনও প্যাকেজের সাথে সম্পর্কিত নয় বলে চিহ্নিত হওয়া অনন্য কীগুলি নিশ্চিত করার জন্য অ্যাপ্লিকেশনগুলির সংস্থাগুলিতে ঘোষিত একটি আইডি হওয়া উচিত যা কোনও অবৈধ অরগিউমেন্টএক্সেপশন নিক্ষেপ করবে।

উত্স থেকে:

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);
}

কারণ আপনার আর. জাভা ফাইলে আইডিটি তৈরি করতে হবে।
স্ট্যাক ওভারফ্লো 14

না, তা হয় না। এটি 2 << 24 এর চেয়ে বেশি হতে হবে, এটাই।
আন্তন দুজনকো

ঠিক আছে, 1 + 2 << 24, 2 + 2 << 24 ইত্যাদি পদ্ধতির আসলে কাজ করে। মনে হচ্ছে একটি অনিয়মিত ফিক্স। আমি জানতে চাই কেন এটি এরকম? ভবিষ্যতের সংস্করণগুলিতে অ্যান্ড্রয়েড ইত্যাদির জন্য কি কোনও ঝুঁকি রয়েছে? এটি ধ্রুবক হিসাবে সংজ্ঞায়িতভাবে ব্যবহার করা কি খুব দূর্গম?
জান বার্গস্ট্রোম

কারণ এটি অ্যান্ড্রয়েড এসডিকে হার্ডকোডযুক্ত। এটি কখনও পরিবর্তন হবে না কারণ অন্যথায় সমস্ত বিদ্যমান অ্যান্ড্রয়েড অ্যাপ্লিকেশন কাজ করা বন্ধ করে দেবে।
আন্তন ডুজেনকো

1
আমি অনুমান করি যে এই সমাধানটির মূল সমস্যাটি হ'ল এটি এই কীটির এককতার গ্যারান্টি দেয় না, যার অর্থ যে কোনও লাইব্রেরি বা অন্যান্য কোড যা সেটট্যাগ বৈশিষ্ট্যটি ব্যবহার করছে তা যুক্ত করে এই যুক্তিটি ভেঙে ফেলতে পারে যদি উত্পন্ন আইডি এই সমাধানটির সাথে মিলবে match
এডগার্ক

3

আমি ব্যবহার করেছি viewHolder.itemTitleTextView.getId()। তবে আপনি আপনার সংস্থানগুলিতেও ঘোষণা করতে পারেন: <item type="id" name="conversation_thread_id"/>



0

কোনও আইডির মাধ্যমে আপনি মানটি সংরক্ষণ করতে চান তার কারণ আপনি এই ট্যাগটিতে একাধিক মান কভার করতে চান, তাই না?
এখানে আরও একটি সহজ সমাধান:
আসুন আমরা বলি যে আপনি এই ট্যাগটিতে দুটি মান (স্ট্রিংস) সংরক্ষণ করতে চান: "প্রথম নাম" এবং "শেষ নাম"। আপনি সেমিকোলন দ্বারা পৃথক করে দুটি স্ট্রিংকে একটি স্ট্রিংয়ে সংরক্ষণ করতে পারেন:

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

... এবং এগুলি একটি স্ট্রিং অ্যারেতে বিভক্ত করে অ্যাক্সেস করুন:

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

0

আপনি এটি ব্যবহার করতে পারেন:

private static final int TAG_ONLINE_ID = View.generateViewId() + 2 << 24;

এককতার জন্য অ্যাপ্লিকেশন-নির্দিষ্ট সংস্থান আইডি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.