লেআউট এক্সএমএল ফাইলের অন্তর্ভুক্ত থাকা অবস্থায় আইডি কীভাবে নির্দিষ্ট করতে হয়


117

আমার লেআউট এক্সএমএল ফাইলটিতে, আমি অন্যান্য লেআউট এক্সএমএল ফাইল অন্তর্ভুক্ত করেছি (প্রতিটি আলাদা আলাদা অ্যান্ড্রয়েড আইডি সহ)।

<include layout="@layout/view_contact_name" android:id="+id/test1"/>
<include layout="@layout/view_contact_name" android:id="+id/test2"/>

তবে আমি যখন এটি এমুলেটরটিতে চালনা করি এবং হাইরেচি ভিউয়ার শুরু করি, তখন প্রতিটি লেআউট এখনও 'NO_ID' দেখায় এবং আমার কোডে আমার কাছে findViewById(R.id.test1)এবংfindViewById(R.id.test2) উভয়ই বাতিল হয়ে যায়।

কেউ কি আমার সমস্যাটি সম্পর্কে আমাকে সাহায্য করতে পারেন?


6
আপনার আইডি @প্রতীক অনুপস্থিত ।
স্বায়ত্তশাসিত

উত্তর:


288

আইডি উল্লেখ করুন <include>

<include layout="@layout/test" android:id="@+id/test1" />

তারপরে findViewByIdবিন্যাসে ক্ষেত্রগুলি অ্যাক্সেস করতে দুটি ব্যবহার করুন

View test1View = findViewById(R.id.test1);
TextView test1TextView = (TextView) test1View.findViewById(R.id.text);

এই পদ্ধতির ব্যবহার করে, আপনি যে কোনও ক্ষেত্রে যে কোনও ক্ষেত্রে আপনার প্রবেশ করতে পারবেন।


18
এই পদ্ধতিটি আমাকে টেস্ট 1 ভিউ অবজেক্টের নাল মান প্রদান করে।
নীরভ শাহ

4
আমি সত্যিই পার্থক্যটি দেখতে পাচ্ছি না, আপনি কি ব্যাখ্যা করতে পারেন?
গডডচেন

30
আমি জানতে পেরেছি যে আমাদের অন্তর্ভুক্ত লেআউটটি যদি মার্জ ব্যবহার করে তবে এটি কোনও সাহায্য করবে না। তবে যেখানে মার্জ ব্যবহার করা হয় না, এটি কাজ করে।
Zlatko

@ জ্লাতকো ইয়েপ, এবং এটি mergeতত্ত্বের সাথেও কাজ করতে পারে না , কারণ mergeএটিকে অন্তর্ভুক্ত করার ফলাফলটি একটি একক দৃষ্টিভঙ্গি নয়, তবে তাদের একগুচ্ছ। সুতরাং এটি ঠিক আছে।
নাম প্রদর্শন করুন

1
মার্জ ব্যবহার না করা হলে এটি কেবল কাজ করবে। মার্জ হওয়ার ক্ষেত্রে এটি এখানে বর্ণিত
জাহিদ রাশিদ

61

আমি জানতে পেরেছি যে আপনি যদি <merge>নিজের অন্তর্ভুক্ত বিন্যাসে ট্যাগ ব্যবহার করেন তবে অন্তর্ভুক্ত আইডিটি মার্জ ট্যাগটিতে স্থানান্তর করে যা আসল দর্শন নয়।

সুতরাং হয় মার্জ সরান, বা কিছু লেআউট সঙ্গে এটি প্রতিস্থাপন।

টর নরবাই লিখেছেন :

<include>ট্যাগ একটি বাস্তব দৃশ্য নন, সুতরাং findByView এটি খুঁজে করা হবে না। @ আইডি অ্যাট্রিবিউট (এবং আপনি অন্তর্ভুক্ত ট্যাগে সেট করেছেন এমন অন্য কোনও বৈশিষ্ট্য) পরিবর্তে অন্তর্ভুক্ত লেআউটের মূল ট্যাগটিতে প্রয়োগ করা হবে। সুতরাং আপনার ক্রিয়াকলাপ.জেটভিউ (R.id.incused1) আসলে <TextView>নিজেই হওয়া উচিত ।


3
ভাল একটা. আমি মার্জ ট্যাগটি মুছে ফেলি এবং এটি কাজ শুরু করে তবে আমার এখানে প্রশ্নটি হল যে যদি কোনও লেআউট ব্যতীত কাজ করে তবে মার্জ ট্যাগের ব্যবহার কী?
অঙ্কুর চৌধুরী

35

রোমেন গাই ইঙ্গিত দেয় যে আপনি ট্যাগের android:idমধ্যে একটি বৈশিষ্ট্য রেখে কোনও অন্তর্ভুক্ত বিন্যাসের আইডিটিকে ওভাররাইড করতে পারেন <include>

<include android:id="@+id/cell1" layout="@layout/workspace_screen" />

1
এটা সঠিক। অন্তর্ভুক্ত লেআউট ফাইলটিতে মূল উপাদানটিকে রেফারেন্স দেওয়ার উপায়টি 'অন্তর্ভুক্ত' ট্যাগে দেওয়া আইডি দ্বারা দেওয়া হয় (যতক্ষণ না এটি দেওয়া হয়)।
টম আর

1
অন্তর্ভুক্ত লেআউটে <অন্তর্ভুক্ত> = মূলের আইডি
আইডিতে ফ্যাডিলস

আমি আইডিটি প্রথমে সেট করে দিলে আমার কাছে উপস্থিত হবে (ট্যাগটি অন্তর্ভুক্ত থাকলে এটি অন্তর্ভুক্ত লেআউটটি থেকে আইডিটিকে ওভাররাইড করে, ডান?), আমার প্রাথমিকভাবে '@ + আইডি / সেল 1' এবং তারপরে বিন্যাস = ' @ লেআউট / ওয়ার্কস্পেস_স্ক্রিন 'অন্তর্ভুক্ত লেআউটটির আইডি সহ অ্যান্ড্রয়েড: আইডিটিকে ওভাররাইড করবে। @ রন রোমেরোর উত্তরগুলি আমার কাছে আরও বেশি অর্থবোধ করে।
নিয়ন ওয়ারেজ

14

আমি মনে করি শীর্ষ উত্তরটি সবচেয়ে গুরুত্বপূর্ণ পয়েন্টটি মিস করেছে এবং ট্যাগগুলি ভেবে ভ্রান্ত করতে পারে <include/>ট্যাগটি এমন একটি ভিউ তৈরি করে যা অন্তর্ভুক্ত সামগ্রীগুলি অন্তর্ভুক্ত করে।

মূল বিষয়টা অন্তর্ভুক্ত যে কারো নির্দেশ চলে না আইডি হয় পাস রুট দৃশ্যে লেআউটের ফাইল অন্তর্ভুক্ত।

এর অর্থ:

// activity_main.xml
<include layout="@layout/somelayout" android:id="@+id/someid"/>

// somelayout.xml
<?xml version="1.0" encoding="utf-8"?>
<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

এটি হয়ে:

// activity_main.xml
<ImageView
    android:id="@+id/someid"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

4

হ্যাঁ এর মতো, তবে সাবধানে ক্ষেত্রের মধ্যে অন্তর্ভুক্ত লেআউটটি একটি কাস্টম হিসাবে যুক্ত হয়ে থাকে এবং আপনি সেই মূল বিন্যাসটি অ্যাক্সেস করতে চান careful এই ক্ষেত্রে @ লেআউট / পরীক্ষার পরীক্ষার সেই বিন্যাসটি আসলে প্রথম লাইনে ফিরে আসে।

test test1View = (test)findViewById(R.id.test1);

2
  1. আপনি প্রতিটি আইডি অন্তর্ভুক্ত ট্যাগ সেট করতে হবে
  2. অন্তর্ভুক্ত শিশু উপাদান একটি নতুন আইডি সেট করে। আপনি যদি নতুন আইডি জেনারেট করতে চান তবে এই এন্ট্রিটি দেখুন: https://stackoverflow.com/a/15442898/1136117

2

সমস্যাটি হ'ল আমরা এমন আইডি ব্যবহারের চেষ্টা করব যা বর্তমান লেআউট ফাইলটিতে ঘোষিত হয়নি। আবার ঘোষণার পরিবর্তে আইডি সহজেই ব্যবহার করে উল্লেখ করা যেতে পারে @+id/। যদি আপনি অ্যান্ড্রয়েড স্টুডিওর মাধ্যমে মূল আইডি নামটি রিফ্যাক্টর করেন তবে এটি অন্তর্ভুক্ত লেআউটেও রিফ্যাক্টরটি করে।

<include layout="@layout/toolbar"/>

<TextView
    android:id="@+id/txt_description"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    **android:layout_below="@+id/toolbar"**
    android:layout_marginTop="16dp"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"/>

2

ব্যবহারের ক্ষেত্রে <RecyclerView>ID খুঁজে পেতে <include>স্ফীত দেখুন একটি দৃষ্টান্ত ব্যবহার করে বা অন্য এটি ফিরে আসবে নাল

public class ViewHolder extends RecyclerView.ViewHolder {

        private mTextView;

        public ViewHolder(View view) {
            super(view);
            View include_1 = view.findViewById(R.id.include_1);
            mTextView = (TextView) include_1.findViewById(R.id.text_id);
        }
    }

1

আপনি যদি অন্তর্ভুক্ত বিন্যাসের মূল ট্যাগটিতে আইডি সেট করে থাকেন তবে আপনি সেই আইডি ব্যবহার করতে পারেন বা অন্তর্ভুক্ত লেআউটে আইডি সেট করতে পারেন।

তবে আপনি উভয় আইডি সেট করতে পারবেন না এটি ব্যতিক্রম হতে পারে।

<include layout="@layout/view_contact_name" android:id="+id/test1"/>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

....
</LinearLayout>

অথবা

<include layout="@layout/view_contact_name"/>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:id="@+id/llBottomMainView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

....
</LinearLayout>

0

অন্তর্ভুক্ত করার বিষয়ে কথা বলার সময় আপনার অন্তর্ভুক্ত লেআউট ফাইলের ভিতরে মূল ভিউতে একটি আইডি থাকে বা নিজেই অন্তর্ভুক্ত লাইনে থাকে এবং উভয়ই নয়। উদাহরণ স্বরূপ:

<include layout="@layout/layout1" android:id="@+id/layout1"/>

লেআউট 1 ফাইল

<RelativeLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/layout2">

</RelativeLayout>

উপরের উদাহরণটি ভুল কারণ প্রযুক্তিগতভাবে আপনার একই লেআউটের জন্য দুটি আইডি ঘোষিত হয়েছে। সুতরাং আপনাকে যা করতে হবে তা হল কোন উপাদানটির আইডি থাকবে pick


0

বাহ, আমি বিশ্বাস করতে পারি না এই প্রশ্নের সঠিক উত্তর এখনও নেই। এটি সহজ ট্যাগ স্তন্যপান। আপনি কেবল সেই জিনিসগুলি পরিবর্তন করতে পারেন android:layout_যা android:idমেলেনি with সুতরাং উত্তর আপনি পারবেন না। দুঃখিত। পরিবর্তে আপনি যা করতে পারেন তা এমন একটি শ্রেণি তৈরি করা যা একটি ভিউগ্রুপ হবে যা অন্তর্ভুক্ত থাকা ভিউগুলিকে ফুলে তুলবে, তারপরে এটিকে আপনার লেআউটে ট্যাগ হিসাবে যুক্ত করুন, তবে এটি প্রায়।

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