2015-08-04 5 views
5

मैं बाद में XML तत्व का संदर्भ कैसे दूं?एंड्रॉइड लेआउट संदर्भ xml तत्व बाद में फ़ाइल

यहां एक विशिष्ट उपयोग केस है। आइए मान लें कि मेरे पास रूट लाइनरलाउट के साथ एक फॉर्म है, जिसमें एकाधिक पंक्तियों के लिए लीनियरलाइट्स शामिल हैं, प्रत्येक पंक्ति में एक या अधिक टेक्स्ट इनपुट क्षेत्र हैं।

यहां एक दृश्य है कि मैं किसके लिए जा रहा हूं। पहली तस्वीर वेन्मो के ऐप से है, दूसरा निम्नलिखित एक्सएमएल का प्रतिपादन है।

Example of Venmo The layout

इस तरह के एक लेआउट ऐसा दिखाई दे सकता:

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <LinearLayout 
     android:id="@+id/row_card_number" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal"> 

     <EditText 
      android:id="@+id/card_number" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:nextFocusDown="@id/month"/> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/row_date" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal"> 

     <EditText 
      android:id="@+id/month" 
      android:layout_height="wrap_content" 
      android:layout_width="100dp" 
      android:nextFocusDown="@id/year"/> 

     <EditText 
      android:id="@+id/year" 
      android:layout_height="wrap_content" 
      android:layout_width="match_parent"/> 
    </LinearLayout> 
</LinearLayout> 

इस प्रयोग के मामले में, आगे संदर्भित necassary है अगले फोकस तत्व सेट करने के लिए। इस तरह, जब आप कीबोर्ड पर अगला बटन दबाते हैं, तो यह सही दृश्य पर जाएगा। इस नमूना xml में, nextFocusDown एस के बिना, अगला दबाने से नाम से महीने तक जाना होगा, और कभी भी वर्ष में नहीं जायेगा।

हालांकि, अगर आप इस संकलन करने का प्रयास करें, तो आपको एक त्रुटि मिल जाएगा:

Error:(18, 36) No resource found that matches the given name (at 'nextFocusDown' with value '@id/month').

इसका कारण यह है आईडी month अभी तक जब मैं इसे संदर्भित करने के लिए कोशिश कर रहा हूँ नहीं प्रारंभ किया गया है, के बाद से है कि बाद में फ़ाइल में। मैं XML में किसी आईडी को संदर्भित कैसे कर सकता हूं जो फ़ाइल में बाद में दिखाई देता है?

+0

यह एक आत्म जवाब सवाल है। मुझे वास्तव में कुछ भी नहीं मिला जो इस अच्छी तरह से समझाया गया, इसलिए मैंने सोचा कि मैं इसे स्वयं करूँगा। सुधार के लिए सुझाव स्वागत है :) –

उत्तर

11

सरल समाधान सिर्फ जब संकलक R.java को पहचान-पत्र जोड़ने के लिए अपने XML पार्सिंग है

android:nextFocusDown="@+id/month"

साथ

android:nextFocusDown="@id/month"

को बदलने के लिए है, यह सिर्फ शीर्ष पढ़ता नीचे तक। जब आपके पास @id/month है, तो यह मौजूदा आईडी के माध्यम से खोजता है, और इसे खोजने में विफल रहता है।

हालांकि, यदि आप @+id/month करते हैं, तो यह एक नई आईडी बनाता है, और उससे लिंक। जब यह वास्तविक माह दृश्य में android:[email protected]+id/month तक पहुंच जाता है, तो यह उसी आईडी पर लिंक करता है जिसे हमने पहले ही बनाया है।


इस सवाल को लाता है: आप @+id/ साथ @id/ की जगह ले सकता है, और @+id/ तत्वों का क्रम की परवाह किए बिना काम करेंगे, तो क्यों भी @id/ उपयोग करने के लिए परेशान?

इसका कारण यह है कि आईडी मौजूद नहीं है, @id/ एक कंपाइलर त्रुटि फेंक देगा, जबकि @+id/ रनटाइम पर एक चेतावनी लॉग करेगा।

<EditText 
    android:id="@+id/month" 
    android:layout_height="wrap_content" 
    android:layout_width="100dp" 
    android:nextFocusDown="@+id/SOME_RANDOM_ID"/> 

<EditText 
    android:id="@+id/year" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent"/> 

जब यह पार्स किया गया है, एक नया आईडी तत्व SOME_RANDOM_ID बनाई गई है:

इस एक्सएमएल पर विचार करें। हालांकि, जब एंड्रॉइड रनटाइम पर इसे लागू करने का प्रयास करता है, तो उसे उस आईडी के साथ कोई तत्व नहीं मिल रहा है।यदि आप लॉगकैट देखते हैं, तो आप इसे देखेंगे:

W/View﹕ couldn't find view with id 2131689604

यह लॉग संदेश दोनों को खोजने और कठिन बनाने के लिए कठिन है। @+id/ में एक छोटा टाइपो और आपके पास एक बग होगा जो डीबग करने के लिए अविश्वसनीय रूप से कठिन हो सकती है। हालांकि, अगर हम किया था:

Error:(18, 36) No resource found that matches the given name (at 'nextFocusDown' with value '@id/SOME_RANDOM_ID').

यह बहुत आसान लगता है और डिबग करने के लिए है:

android:nextFocusDown="@id/SOME_RANDOM_ID"

फिर हम एक संकलक त्रुटि, जैसे कुछ मिल चाहते हैं।


tl; डॉ: आप @+id/ बजाय @id/ उपयोग कर सकते हैं और आप संदर्भ अग्रेषित करने के लिए सक्षम हो जाएगा, लेकिन ध्यान दें कि कि छोटे लिखने की त्रुटियों अविश्वसनीय रूप से डिबग करने के लिए मुश्किल बना सकते हैं।

आप एक्सएमएल में रिवर्स ऑर्डर में सभी दृश्यों को मौजूद बनाने के लिए रिलेटिवलाइट का उपयोग करने में सक्षम हो सकते हैं, लेकिन ऐसा लगता है कि यह मेरे लिए अधिक है।

0

मैं हाल ही में एक ही मुद्दा था और मैं @ + id/my_new_id पहली बार मैं तत्व जिक्र किया गया और बाद में तत्व परिभाषा एक्सएमएल में, मैं एंड्रॉयड के लिए सौंपा @ आईडी/my_new_id प्रयोग किया है: आईडी विशेषता। ऐसा लगता है कि यह ठीक काम करता है और संभव चेतावनी से बचने के लिए एक ही आईडी से एक ही आईडी के साथ @ + id लिखना जरूरी नहीं है।

उदाहरण के लिए:

<LinearLayout 
    ... 
    android:layout_toLeftOf="@+id/my_new_id" 
    ... > 

... 

</LinearLayout> 

<ImageButton 
    android:id="@id/my_new_id" 
    ... /> 
संबंधित मुद्दे