2012-03-16 14 views
6

मैं एंड्रॉइड के लिए कस्टम कंट्रोल पर काम कर रहा हूं और हालांकि मैंने सुझाव दिया है कि here का सुझाव दिया गया है कि मैं कुछ गलत कर रहा हूं।एंड्रॉइड कस्टम कंट्रोल नेमस्पेस इश्यू

MyComponent.java

public MyComponent(Context context, AttributeSet attrs) 
{ 
    super(context); 
    TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.MyComponent); 
    CharSequence myId = arr.getString(R.styleable.MyComponent_identifier); 

    if (myId != null) 
    { 
    this.setIdentifier(myId.toString()); 
    } 

    Integer cds = arr.getInteger(R.styleable.MyComponent_cd_number, 0); 

    if(cds != null) 
    { 
    this.setCds(cds); 
    } 

    arr.recycle(); 
} 

attrs.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="MyComponent">  
    <attr name="cd_number" format="integer" /> 
    <attr name="identifier" format="string" /> 
    </declare-styleable> 
</resources> 

main.xml

:

यहाँ किसी को भी समस्या दिखाई देती है, तो कर सकते हैं देखने के लिए मेरी कोड है

<TableLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:bgl="http://schemas.android.com/apk/res/my.test.package.components" 
    android:id="@+id/table" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    ... 

    <my.test.package.MyComponent 
    android:id="@+id/hand" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_span="2" 
     bgl:cd_number="4" 
     bgl:identifier="plr"/> 

    ... 

    </TableLayout> 

जब मैं इस डाल मैं निम्नलिखित त्रुटियाँ हो:

त्रुटि: कोई संसाधन पहचानकर्ता विशेषता 'cd_number' पैकेज 'my.test.package' त्रुटि में मिला: कोई संसाधन पहचानकर्ता विशेषता के लिए मिला 'पहचानकर्ता' पैकेज में 'my.test.package'

अगर मैं की तरह कुछ करने के लिए अपने नाम स्थान बदलने के लिए:

xmlns:bgl="http://schemas.mywhatever.com/apk/res/my.test.package" 

... त्रुटियों w जाना अरे और बात चलती है लेकिन myId शून्य है और सीडी 0 (डिफ़ॉल्ट मान!) है MyComponent.java कन्स्ट्रक्टर पर वापस।

मैं कहूंगा कि यह कुछ बहुत ही मूल गलती है लेकिन मैं इसे खोज नहीं पा रहा हूं और इस पर बहुत अधिक दस्तावेज़ीकरण नहीं है, इसलिए मैंने यहां पूछने का फैसला किया।

अग्रिम धन्यवाद!

उत्तर

14

ठीक defStyle पैरामीटर में ले जाता है के साथ प्रयास करें बुला रहा था निकला। मुझे हल हो गया!

मूल पोस्ट मैं था पर:

xmlns:bgl="http://schemas.android.com/apk/res/my.test.package 

... लेकिन मेरे स्रोत में मैं था:

xmlns:bgl="http://schemas.android.com/apk/res/my.test.package.components 

... क्योंकि मैंने सोचा एक घटक पैकेज का URI रखना चाहिए ।

यह गलत है!

xmlns पर यह घोषणापत्र पर घोषित आवेदन नाम होना चाहिए!

जब मैंने xmlns के "घटक" भाग को हटा दिया, तो उसने मैनिफेस्ट में एप्लिकेशन नाम "मिलान" किया और त्रुटियां चली गईं और जब मैंने डीबग में चीज़ चलाई तो मैं वास्तव में उन मानों को देख सकता था जो मैं पैरामीटर को पास कर रहा था एक्सएमएल में!

उम्मीद है कि यह किसी और की मदद करेगा! :-)

अद्यतन

बाद में मैं एक पुस्तकालय में नियंत्रण स्थानांतरित करने के लिए की जरूरत थी और इस समस्या का सामना करना पड़ा फिर से पर। ऐसा लगता है कि जब आप एक पुस्तकालय में घटक डाल दिया और एक ग्राहक अनुप्रयोग पर इसका इस्तेमाल आप नीचे के रूप में xmlns घोषित करना चाहिए:

xmlns:myns="http://schemas.android.com/apk/res-auto" 

आप ऐसा करते हैं (और पुस्तकालय एक Android निर्भरता के रूप में घोषित किया है) ग्रहण (या यह एंड्रॉइड है?) उचित विशेषता बाइंडिंग के लिए निर्भरताओं की खोज करेगा।

+1

महान नौकरी शोध और उत्तर प्रदान करना। रेस-ऑटो फिक्स बिल्कुल वही है जो मुझे चाहिए था। – AlanKley

+0

'res-auto'। आप सुंदरी! – darksider474

+0

बीजीएल और मर्न्स क्या है, मैं उस नाम को कैसे सेट कर सकता हूं – Nepster

0

मैं एक समस्या इस के समान था, यह एक अलग निर्माता

निर्माता कि

public MyComponent(Context context, AttributeSet attrs, int defStyle) 
+0

धन्यवाद, ट्रिग्स। दुर्भाग्य से मेरी समस्या एक और प्रतीत होती है। मैंने आपके द्वारा सुझाए गए सीटीओ को परिभाषित किया है और यदि मैं नेमस्पेस नहीं बदलता तो त्रुटियां बनी रहती हैं। यदि मैं xmlns को बदलता हूं तो यह वही व्यवहार करेगा: नया सीटीओ कभी नहीं बुलाया जाता है और myId शून्य है और सीडी 0 जैसा पहले था। अनजान विचार? किसी को? –

संबंधित मुद्दे