जब लेआउट xml फ़ाइल में शामिल हो तो id कैसे निर्दिष्ट करें


117

मेरे लेआउट xml फ़ाइल में, मैंने अन्य लेआउट xml फ़ाइल (प्रत्येक एक अलग एंड्रॉइड आईडी के साथ) को शामिल किया है।

<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
आपकी आईडी में @सिंबल गायब हैं ।
AutonomousApps

जवाबों:


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
यह विधि मुझे test1View ऑब्जेक्ट के लिए अशक्त मान लौटाती है।
नीरव शाह

4
मैं वास्तव में अंतर नहीं देखता, क्या आप समझा सकते हैं?
गोड्डन

30
मुझे पता चला कि अगर हमारे द्वारा शामिल किया गया लेआउट मर्ज का उपयोग कर रहा है, तो यह मदद नहीं करेगा। लेकिन मामले में जहां मर्ज का उपयोग नहीं किया जाता है, यह काम करता है।
ज़्लातको

@Zlatko हां, और यह mergeसिद्धांत के साथ भी काम नहीं कर सकता , क्योंकि इसमें शामिल होने का परिणाम mergeएक एकल दृश्य नहीं है, लेकिन उनमें से एक गुच्छा है। तो ये ठीक है।
प्रदर्शित नाम

1
यह केवल तभी काम करेगा जब मर्ज का उपयोग नहीं किया जाता है। मर्ज के मामले में यह यहाँ निर्दिष्ट नहीं किया जा सकता है: code.google.com/p/android/issues/detail?id=36918#c3
जाहिद रशीद

61

मुझे पता चला, कि यदि आप <merge>अपने शामिल लेआउट में टैग का उपयोग कर रहे हैं , तो आईडी को मर्ज टैग में स्थानान्तरण को शामिल करें जो कि वास्तविक दृश्य नहीं है।

इसलिए या तो मर्ज को हटा दें, या इसे कुछ लेआउट के साथ बदल दें।

टोर नॉर्बी ने लिखा :

<include>टैग एक वास्तविक दृश्य नहीं है, इसलिए findByView इसे खोजने नहीं होंगे। @Id विशेषता (और शामिल टैग पर आपके द्वारा सेट की गई अन्य विशेषताएँ) इसके बजाय शामिल लेआउट के रूट टैग पर लागू होती हैं। तो आपकी गतिविधि .getView (R.id.included1) वास्तव में <TextView>स्वयं होनी चाहिए ।


3
अच्छा था। मैं मर्ज टैग को हटा देता हूं और यह काम करना शुरू कर देता है, लेकिन मेरा सवाल यहां यह है कि मर्ज टैग का उपयोग क्या है अगर किसी में इसके बिना काम करने वाला लेआउट शामिल है?
अंकुर चौधरी

35

रोमेन गाइ इंगित करता है कि आप टैग के android:idअंदर एक विशेषता डालकर किसी सम्मिलित लेआउट की आईडी को ओवरराइड कर सकते हैं <include>

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

1
यह सही है। शामिल लेआउट फ़ाइल में मूल तत्व को संदर्भित करने का तरीका 'शामिल' टैग में आईडी द्वारा दिया गया है (जब तक कि यह नहीं दिया जाता है)।
टॉम आर

1
आईडी में <शामिल हैं = = रूट की आईडी शामिल लेआउट में
Fadils

यह मेरे लिए प्रकट होता है यदि मैं आईडी पहले सेट करता हूं (शामिल टैग में, यह शामिल लेआउट से आईडी को सही करता है, ठीक है?), मेरे पास प्रारंभ में '@ आईडी / सेल 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

हां ऐसा है, लेकिन सावधान जब सम्मिलित फ़ील्ड में डाला गया लेआउट एक कस्टम है और आप उस रूट लेआउट का उपयोग करना चाहते हैं। इस मामले में वह लेआउट @ लेआउट / परीक्षण परीक्षण, वास्तव में पहली पंक्ति में वापस आ गया है।

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

2
  1. आपको आईडी शामिल करने के लिए प्रत्येक टैग को सेट करना होगा
  2. शामिल बाल तत्व एक नई आईडी सेट करता है। यदि आप नई आईडी जनरेट करना चाहते हैं, तो इस प्रविष्टि को देखें: https://stackoverflow.com/a/15442898/1136367

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>करने के मामले में <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

यदि आपने id को शामिल लेआउट के रूट टैग में सेट किया है तो आप उस आईडी का उपयोग कर सकते हैं या आप आईडी को शामिल लेआउट में सेट कर सकते हैं।

लेकिन आप दोनों को आईडी सेट नहीं कर सकते हैं यह अपवाद फेंक सकता है।

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

उपरोक्त उदाहरण गलत है क्योंकि तकनीकी रूप से आपके पास एक ही लेआउट के लिए दो आईडी घोषित हैं। तो आपको जो करना है वह चुनें कि किस तत्व की आईडी होगी।


0

वाह, मैं विश्वास नहीं कर सकता इस सवाल का अभी तक सही जवाब नहीं है। यह सरल टैग चूसना है। आप केवल उन चीजों को बदल सकते हैं, जिनके साथ शुरू होता है android:layout_जो android:idमेल नहीं खाता है। तो जवाब है आप नहीं कर सकते। माफ़ करना। इसके बजाय आप क्या कर सकते हैं एक वर्ग बना सकते हैं जो एक व्यूग्रुप होगा जो अंदर के शामिल विचारों को फुलाएगा, फिर इसे अपने लेआउट में एक टैग के रूप में जोड़ें, लेकिन यह इसके बारे में है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.