2011-12-27 18 views
28

मैं कस्टम नियंत्रण में declare-styleable जैसे एक्सएमएल (बंडल अतिरिक्त पैरामीटर का उपयोग किए बिना) का उपयोग करके एंड्रॉइड खंड में कस्टम विशेषताओं को परिभाषित करना चाहता हूं। लेकिन AttrSet पैरामीटर के साथ कोई रचनाकार नहीं हैं, तो क्या यह संभव है? क्या विशेषताएँ प्राप्त करने के लिए मैं सिर्फ public void onInflate(android.app.Activity activity, android.util.AttributeSet attrs, android.os.Bundle savedInstanceState) ओवरराइड कर सकता हूं?एंड्रॉइड टुकड़े में कस्टम विशेषताएं

+0

त्रुटियों हो रही है, जबकि संकलन: '... \ एप्लिकेशन \ रेस \ लेआउट \ select_category.xml: 26: त्रुटि: कोई संसाधन पहचानकर्ता विशेषता 'showRadioButtons के लिए मिला 'पैकेज में' com.companyX.projectY ' ... \ app \ res \ layout \ select_category.xml: 26: त्रुटि: पैकेज' com.companyX.projectY ' में विशेषता' हाइलाइट चयन 'के लिए कोई संसाधन पहचानकर्ता नहीं मिला .. \ app \ res \ layout \ select_category.xml: 26: त्रुटि: पैकेज 'com.companyX.projectY' में 0 'unselectedColor' विशेषता के लिए कोई संसाधन पहचानकर्ता नहीं मिला – Anton

+0

ऐप xml नेमस्पेस और घोषित-स्टाइल योग्य लिखित कोर हैं ectly। यदि आवश्यक हो तो उन्हें प्रदान कर सकते हैं, – Anton

उत्तर

1
@Override 
public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { 
    super.onInflate(activity, attrs, savedInstanceState); 
    // Your code here to process the attributes 
} 
+2

काम करता है, लेकिन लिंट मार्कर (एंड्रॉइड टूल्स> साफ़ लिंट मार्कर) को साफ़ करना सुनिश्चित करें। मैंने 10 एमएन खर्च करने की कोशिश की कि यह क्यों नहीं बना रहा था! – tdevaux

+0

धन्यवाद tdevaux, मैंने इसे फिर से पढ़ने से पहले 5 मिनट बिताए। मेरे जीवन में मेरे पास 5 और मिनट उपलब्ध हैं! – dhaag23

71

समर्थन 4 डेमोस के लिए लिंक बदल दिया गया है या पूरे समाधान को पोस्ट करने के लिए बदला जा सकता है। ये रहा।

  1. attrs.xml रेस में फ़ाइल बनाएँ/फ़ोल्डर महत्व देता है। या अगर फ़ाइल पहले से मौजूद है तो नीचे दी गई सामग्री जोड़ें। यह

    /** 
    * Parse attributes during inflation from a view hierarchy into the 
    * arguments we handle. 
    */ 
    @Override 
    public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { 
        super.onInflate(activity, attrs, savedInstanceState); 
        Log.v(TAG,"onInflate called"); 
    
        TypedArray a = activity.obtainStyledAttributes(attrs,R.styleable.MyFragment); 
    
        CharSequence myString = a.getText(R.styleable.MyFragment_my_string); 
        if(myString != null) { 
         Log.v(TAG, "My String Received : " + myString.toString()); 
        } 
    
        int myInteger = a.getInt(R.styleable.AdFragment_my_integer, -1); 
        if(myInteger != -1) { 
         Log.v(TAG,"My Integer Received :" + myInteger); 
        } 
    
        a.recycle(); 
    } 
    
  2. में

    <?xml version="1.0" encoding="utf-8"?> 
    <resources> 
    <declare-styleable name="MyFragment"> 
        <attr name="my_string" format="string"/> 
        <attr name="my_integer" format="integer"/> 
    </declare-styleable> 
    

  3. अवहेलना टुकड़ा की onInflate प्रतिनिधि और पढ़ने के गुण निम्नलिखित के रूप में अपने लेआउट फ़ाइल में इन विशेषताओं को पारित करना। सिर्फ एक उदाहरण

    <?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:app="http://schemas.android.com/apk/res-auto" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" > 
    
        <TextView 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:text="This is android activity" /> 
    
        <fragment 
         android:id="@+id/ad_fragment" 
         android:name="com.yourapp.packagename.MyFragment" 
         android:layout_width="fill_parent" 
         android:layout_height="50dp" 
         android:layout_alignParentBottom="true" 
         app:my_string="Hello This is HardCoded String. Don't use me" 
         app:my_integer="30" /> 
    
    </RelativeLayout> 
    

यही सब। यह एक कामकाजी समाधान है।

यदि आप xml में कोई नेमस्पेस त्रुटि देखते हैं तो ऐसा करने पर। बार-बार परियोजना की सफाई करने का प्रयास करें। यह कभी-कभी दयनीय लेकिन ग्रहण और कभी-कभी गलत व्यवहार करता है।

आशा है कि यह दूसरों :)

चीयर्स में मदद करता है

+2

मेरा एंड्रॉइड स्टूडियो एक्सएमएल में लाल अंडरलाइन के साथ कस्टम विशेषताओं को दिखा रहा है जिसमें एक त्रुटि है, लेकिन पूरी परियोजना ठीक है। किसी ऐसे व्यक्ति के लिए एफवाईआई जो सोच सकता है कि वे अपनी लेआउट फ़ाइल में उन त्रुटियों को सही तरीके से देख रहे हैं। – Pocha

+1

आप xmlns के बजाय 'http: // schemas.android.com/apk/res-auto' का उपयोग कर सकते हैं: app =" http://schemas.android.com/apk/res/com.yourapp.packagename "ऑटो पर - पैकेज पैकेज नाम। http://stackoverflow.com/questions/10448006/xml-namespace-declaration-auto-substitute-package-name –

+0

ठीक है, मैंने पहले इसे याद किया है। यदि आप, मेरी तरह, प्रतिलिपि इसे दो स्थानों से चिपकाते हैं, ध्यान दें और सुनिश्चित करें कि नेमस्पेस मेल खाते हैं, उदा। ** xmlns: $ {NameSpace} ** और विशेषता में समान ** $ {NameSpace} **: विशेषता = "..." – TacB0sS