5

वर्तमान जवाब मददगार नहीं हैं, इस सवाल का मुझे लगता है कि एक लेआउट अनावश्यक रूप से बढ़ा है जब बनाई गई एक कस्टम दृश्य के साथ एक पुस्तकालय बनाया अनुत्तरितलाइब्रेरी की शैली विशेषताओं कोई मान भले ही वे स्पष्ट रूप से सेट कर रहे हैं

है। लेआउट में दृश्य style="?attr/labelStyle" या किसी अन्य विशेषता के साथ स्टाइल किए गए हैं।

विशेषता घोषित किया जाता है लाइब्रेरी की attrs.xml:

<attr name="myViewStyle" format="reference"/> 

<declare-styleable name="MyView"> 
    <attr name="labelStyle" format="reference|color"/> 
</declare-styleable> 

मैं लाइब्रेरी की styles.xml में इस विशेषता के लिए एक डिफ़ॉल्ट मान निर्धारित किया है: में

<style name="MyViewStyle"> 
    <item name="labelStyle">@style/LabelStyle</item> 
</style> 

<style name="LabelStyle"> 
    <item name="android:textColor">?android:attr/textColorPrimary</item> 
    <item name="...">...</item> 
</style> 

और अंत में लाइब्रेरी की themes.xml:

<style name="MyViewStyleLight" parent="Theme.AppCompat.Light"> 
    <item name="myViewStyle">@style/MyViewStyle</item> 
</style> 

अब यह वें था ई लाइब्रेरी की डिफ़ॉल्ट शैलियों, लेकिन यह मुख्य परियोजना styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light"> 
    <item name="myViewStyle">@style/MyViewStyleCustom</item> 
</style> 

<style name="MyViewStyleCustom" parent="MyViewStyleLight"> 
    <item name="android:textColor">@color/gray</item> 
    <item name="...">...</item> 
</style> 

में ओवरराइड की गई है कस्टम दृश्य कोड:

public MyView(Context context) { 
    this(context, null, R.attr.myViewStyle, 0); 
} 

public MyView(Context context, @Nullable AttributeSet attrs) { 
    this(context, attrs, R.attr.myViewStyle, 0); 
} 

public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 
    this(context, attrs, defStyleAttr, 0); 
} 

public MyView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
    super(createThemeWrapper(context, R.attr.myViewStyle, R.style.MyViewStyleLight), 
      attrs, defStyleAttr, defStyleRes); 
    initLayout(); 
} 

private static Context createThemeWrapper(Context context, int styleAttr, int defaultStyle) { 
    final TypedArray ta = context.obtainStyledAttributes(new int[]{styleAttr}); 
    int style = ta.getResourceId(0, defaultStyle); 
    ta.recycle(); 
    return new ContextThemeWrapper(context, style); 
} 

private void initLayout() { 
    LayoutInflater inflater = LayoutInflater.from(getContext()); 
    inflater.inflate(R.layout.my_view, this); 
    ... 
} 

मैं नीचे ContextThemeWrapper के बारे में समझाने। अब ऐप लाइन पर दुर्घटनाग्रस्त हो जाता है जहां लेआउट फुलाया जाता है। क्रैश लॉग का महत्वपूर्ण हिस्सा यहां दिया गया है:

android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class com.example.MyView 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:539) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
     [...] 
    Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 13: TypedValue{t=0x2/d=0x7f030057 a=-1} 
     at android.content.res.TypedArray.getDrawable(TypedArray.java:867) 
     [...] 

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

मुझे अपनी लाइब्रेरी को कैसे शैलीबद्ध करना है? मैं लगभग निश्चित हूं कि मैंने हर चीज को SublimePicker library जैसा ही किया लेकिन यह काम नहीं करेगा। ContextThemeWrapper के साथ भाग में थोड़ा अंतर है, लेकिन शायद यह समस्या नहीं है। मुझे लगता है कि मैं कहीं छोटी चीज भूल गया हूं जो विशेषता को कोई मूल्य नहीं देता है, कुछ जुड़ा नहीं है, मुझे नहीं पता।

मुझे पता है कि यह एक बहुत लंबा सवाल है, लेकिन यह अधिक संक्षिप्त नहीं हो सकता है, मैंने जितना संभव हो उतना सरल बनाया। मैंने अधिकांश जानकारी को बदल दिया जो मेरे प्रश्न के पिछले संस्करण में था, जिससे इसे पूरी तरह से अलग किया गया। दो जवाब अब प्रासंगिक नहीं हैं, न कि वे कभी भी थे। बक्षीस को स्वचालित रूप से पुरस्कृत किया गया था।

अगर यह किसी की मदद कर सकता है तो मैं अपनी वास्तविक परियोजना में एक डाउनलोड जोड़ सकता हूं, लेकिन जैसा कि मैंने कहा है कि इस सरलीकृत उदाहरण में मेरी परियोजना के समान सटीक रूप है।

+0

अधिरोहित आप कहते हैं कि आप अपने पुस्तकालय में और अपनी गतिविधि में उस गुण के लिए एक मूल्य निर्धारित किया है नहीं कर रहा है , लेकिन मुझे आपके प्रश्न में केवल एक '