প্রোগ্রামিয়ালি কোনও ভিউতে আমি কীভাবে একটি আইডি নির্ধারণ করতে পারি?


202

একটি এক্সএমএল ফাইলে, আমরা একটি ভিডির মতো একটি আইডি নির্ধারণ করতে পারি android:id="@+id/something"এবং তারপরে কল করতে পারি findViewById(), তবে প্রোগ্রামালিভাবে একটি ভিউ তৈরি করার সময়, আমি কীভাবে একটি আইডি বরাদ্দ করব?

আমি মনে করি setId()ডিফল্ট অ্যাসাইনমেন্টের মতো নয়। setId()অতিরিক্ত

কেউ আমাকে সংশোধন করতে পারেন?


1
উপসেট: কিভাবে অনন্য ID- র জেনারেট করতে: stackoverflow.com/questions/1714297/...
সিরো Santilli郝海东冠状病六四事件法轮功

উত্তর:


521

অ্যান্ড্রয়েড idওভারভিউ

একটি অ্যান্ড্রয়েড idহল একটি পূর্ণসংখ্যা যা সাধারণত দর্শন সনাক্ত করতে ব্যবহৃত হয়; এই idএক্সএমএল (যখন সম্ভব নয়) এবং কোড মাধ্যমে মাধ্যমে নির্ধারিত করা যেতে পারে (প্রোগ্রামেটিক্যালি।) idজন্য XML-সংজ্ঞায়িত রেফারেন্স পাবার জন্য সর্বাধিক কার্যকরী Viewগুলি একটি দ্বারা উত্পন্ন Inflater(যেমন ব্যবহার করে যেমন setContentView।)

idমাধ্যমে বরাদ্দ করুনXML

  • আপনার ভিউতে android:id="@+id/কোনও নামের একটি বৈশিষ্ট্য যুক্ত করুন "
  • যখন আপনার অ্যাপ্লিকেশনটি নির্মিত হয়, কোডগুলিতে ব্যবহারের জন্য android:idএটিকে একটি অনন্য দেওয়া হবে int
  • আপনার অবগতির android:idএর int"ব্যবহার কোডে মান R.id.somename" (কার্যকরভাবে একটি ধ্রুবক।)
  • এটি intবিল্ড থেকে বিল্ডপরিবর্তিত হতে পারে তাই প্যাকেজ.নাম / থেকে কোনও আইডি অনুলিপি করবেন না , কেবল "কিছু নাম" ব্যবহার করুন ।gen/R.javaR.id.
  • (এছাড়াও, এক্সএমএল এ idনির্ধারিত একটি এটিকে উত্পন্ন Preferenceকরার সময় ব্যবহার করা হয় না ))PreferenceView

idকোডের মাধ্যমে বরাদ্দ করুন (প্রোগ্রাম্যাটিকভাবে)

  • Int idব্যবহার করে ম্যানুয়ালি সেট করুনsomeView.setId();
  • intঅবশ্যই ধনাত্মক হবে, কিন্তু অন্যথায় এটা যাহা চান হতে পারে arbitrary- হয় (পড়া এই ভয়ঙ্কর রাখা।)
  • উদাহরণস্বরূপ, যদি আইটেমগুলি উপস্থাপন করে এমন বেশ কয়েকটি ভিউ তৈরি করে এবং সংখ্যা নির্ধারণ করে, আপনি তাদের আইটেম নম্বরটি ব্যবহার করতে পারেন।

স্বতন্ত্রতা idগুলি

  • XML-সাইন করা idগুলি অনন্য হবে।
  • কোড-নির্ধারিত idগুলি অনন্য হতে হবে না
  • কোড-নির্ধারিত idএস - এর সাথে তাত্ত্বিকভাবে (তাত্ত্বিকভাবে) বিরোধী হতে XMLপারে id
  • idসঠিকভাবে জিজ্ঞাসা করা থাকলে (পড়তে থাকুন) এই বিবাদমানগুলির পক্ষে কিছু আসে যায় না ।

কখন (এবং কেন) দ্বন্দ্বপূর্ণ idবিষয়গুলি বিবেচনা করে না

  • findViewById(int)আপনি যে ভিউটি নির্দিষ্ট করেছেন তার থেকে ভিউ হায়ারার্কির মাধ্যমে গভীরতার-প্রথম পুনরাবৃত্তির সাথে পুনরাবৃত্ত হবে এবং Viewএটি কোনও মিলের সাথে খুঁজে পাওয়া প্রথমটি ফিরিয়ে দেবে id
  • শ্রেণিবিন্যাসে idকোনও এক্সএমএল-সংজ্ঞায়িত হওয়ার আগে যতক্ষণ কোনও কোড-নির্ধারিত অ্যাসাইন করা থাকে না, ততক্ষণ সর্বদা এক্সএমএল-সংজ্ঞায়িত ভিউটি ফিরিয়ে দেবে তাই 'ডি।idfindViewById(R.id.somename)id

পরিবর্তনশীল দৃশ্যগুলি এবং বরাদ্দ করা তৈরি করা হচ্ছে IDগুলি

  • এক্সএমএল লেআউটে, এর ViewGroupসাথে একটি খালি সংজ্ঞা দিন id
  • যেমন একটি LinearLayoutসঙ্গে android:id="@+id/placeholder"
  • গুলি ViewGroupসহ স্থানধারককে জনিত করতে কোড ব্যবহার করুন View
  • আপনার যদি প্রয়োজন হয় বা চান, idপ্রতিটি দৃশ্যে সুবিধাজনক যে কোনও গুলি বরাদ্দ করুন ।
  • স্থানধারক.ফাইন্ডভিউবিআইআইডি (সুবিধাজনক) ব্যবহার করে এই শিশুদের দর্শনগুলি জিজ্ঞাসা করুন;

  • API 17 প্রবর্তিত View.generateViewId()যা আপনাকে একটি অনন্য আইডি তৈরি করতে দেয় allows

আপনি যদি আপনার মতামতের রেফারেন্সগুলি আশেপাশে রাখতে চান , তবে সেগুলি দিয়ে তাত্ক্ষণিকভাবে getApplicationContext()নিশ্চিত হয়ে নিন এবং প্রতিটি রেফারেন্স নাল-ইন করতে ভুলবেন না onDestroy। স্পষ্টতই ফুটো করা Activity(ধ্বংস হয়ে যাওয়ার পরে এটির উপর ঝুলানো) অপব্যয়ী .. :)

android:idকোডে ব্যবহারের জন্য একটি এক্সএমএল সংরক্ষণ করুন

API 17 প্রবর্তিত View.generateViewId() যা একটি অনন্য আইডি উত্পন্ন করে। (এটিকে নির্দেশ করার জন্য পরিবর্তন-গ্রহণ-পরিবর্তনগুলি ধন্যবাদ)) *

যদি আপনার ViewGroupএক্সএমএল এর মাধ্যমে সংজ্ঞায়িত না করা যায় (বা আপনি এটি হতে চান না) তবে এটি অনন্য থেকে যায় তা নিশ্চিত করতে আপনি XML এর মাধ্যমে আইডিটি সংরক্ষণ করতে পারেন:

এখানে মান / ids.xML একটি কাস্টম সংজ্ঞায়িত করে id:

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

তারপরে একবার ভিউ গ্রুপ বা ভিউ তৈরি হয়ে গেলে আপনি কাস্টম আইডি সংযুক্ত করতে পারেন

myViewGroup.setId(R.id.reservedNamedId);

বিরোধপূর্ণ idউদাহরণ

অস্পষ্ট উদাহরণের মাধ্যমে স্বচ্ছতার জন্য, idপর্দার আড়ালে কোনও বিরোধ দেখা দিলে কী ঘটে তা পরীক্ষা করে দেখি ।

বিন্যাস / 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 ..

এরপরে, মাইএকটিভিটি.জভা প্রোগ্রাম যুক্তভাবে কিছু সংখ্যক ভিউ সংজ্ঞায়িত করে (কোডের মাধ্যমে):

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দুটির মধ্যে একটির id12 টি রয়েছে! তবে যদি আমরা স্থানধারকের শিশু দৃষ্টিভঙ্গিগুলি জিজ্ঞাসা করি তবে এটি আসলেই কোনও সমস্যা নয়:

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

* এত খারাপ না



নোটটি findViewByIdএকটি গভীরতা-প্রথম অন্বেষণ করে, সুতরাং "হায়ারার্কিতে কোনও এক্সএমএল-সংজ্ঞায়িত আইডির উপরে নির্ধারিত কোড-আইড না থাকা পর্যন্ত" প্রযুক্তিগতভাবে সঠিক নয়; এটি "উপরে" পরিবর্তে "পূর্বে"।
করু

অ্যান্ড্রয়েড বিকাশকারী সরঞ্জামগুলির আরও সাম্প্রতিক সংস্করণগুলিতে, প্রোগ্রামিয়ালি আইডিটিকে একটি স্বেচ্ছাসেবী মানতে সেট করে সংকলক ত্রুটি হিসাবে চিহ্নিত করা হবে। মানটি আসল সংস্থান আইডি হিসাবে প্রত্যাশিত।
থমাস ডাব্লু

আমি বিশ্বাস করি এটি পাঁচ বছর আগে যখন আমি উত্তর দিয়েছিলাম তখনও এমনটি হয়েছিল - এজন্য কাস্টম আইডিটির সংজ্ঞা দিতে হয়েছিল ids.xml। সত্যিকারের নির্বিচার আইডির জন্য, View.generateViewId()(এপিআই 17) ব্যবহার করুন । (দয়া করে আপনার
বক্তব্যটি

> (এছাড়াও, এক্সএমএল-এ পছন্দ হিসাবে নির্ধারিত আইডি ব্যবহার করা হয় না যখন পছন্দটি তার ভিউ উত্পন্ন করে।) সে সম্পর্কে খুব আগ্রহী। আমার কোডটি এর থেকে উত্তরাধিকার সূত্রে PreferenceDialogFragmentCompatমনে হচ্ছে আইডির আইডির সাথে R.idহায়ারার্কির সাথে মেলে না। এইভাবে আমি আইডির মাধ্যমে ভিউটি পাই না।
urk

6

আপনি কেবল এটির View.setId(integer)জন্য ব্যবহার করতে পারেন । এক্সএমএলে, আপনি একটি স্ট্রিং আইডি সেট করে নিলেও এটি পূর্ণসংখ্যায় রূপান্তরিত হয়। এর কারণে, আপনি Views প্রোগ্রামগতভাবে যুক্ত করার জন্য কোনও (ধনাত্মক) পূর্ণসংখ্যা ব্যবহার করতে পারেন।

Viewডকুমেন্টেশন অনুযায়ী

সনাক্তকারীর এই ভিউয়ের শ্রেণিবিন্যাসে অনন্য হতে হবে না। সনাক্তকারী একটি ধনাত্মক সংখ্যা হওয়া উচিত।

সুতরাং আপনি আপনার পছন্দ মতো কোনও ইতিবাচক পূর্ণসংখ্যা ব্যবহার করতে পারেন তবে এই ক্ষেত্রে সমতুল্য আইডির সাথে কিছু মতামত থাকতে পারে। আপনি যদি কিছু মূল বিষয়বস্তু সহ সেটট্যাগে কল করে ক্রমবিন্যাসের কিছু ভিউ সন্ধান করতে চান তবে তা কার্যকর হতে পারে।

এই উত্তর ক্রেডিট ।


5

হ্যাঁ, আপনি setId(value)যে কোনও ভিউটিতে আপনার পছন্দ মতো (ইতিবাচক) পূর্ণসংখ্যার মানটি দিয়ে কল করতে পারেন এবং তারপরে এটি ব্যবহার করে প্যারেন্ট পাত্রে খুঁজে পেতে পারেন findViewById(value)। নোট করুন যে setId()ভিন্ন ভিন্ন ভাইবোন দর্শনগুলির জন্য একই মান সহ কল করা বৈধ , তবে findViewById()কেবল প্রথমটিই ফিরে আসবে।


1
মনে রাখবেন যে আপনাকে শূন্যের চেয়ে বড় পূর্ণসংখ্যা ব্যবহার করতে হবে।
পিটার আজতাই

যদিও FindViewById (int) আপনার নির্দিষ্ট করা ভিউ থেকে ক্রমবর্ধমান পুনরাবৃত্ত হবে এবং 1 ম উত্তরে নির্দিষ্ট করা ম্যাচিং আইডির সাথে এটি খুঁজে পাওয়া প্রথম দেখুনটি সবচেয়ে নির্ভুল।
অনিকেত ঠাকুর

হ্যাঁ, findViewByIdকোনও পরিচিত পূর্বপুরুষকে ডেকে আনা কর্মক্ষমতাগত কারণগুলির জন্য একটি ভাল ধারণা, তবে সঠিক আইডির সাথে যদি কোনও থাকে তবে এটি কোনও তাত্ক্ষণিক শিশুকে খুঁজে পাওয়ার গ্যারান্টি দেয় না।
কারু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.