45

मैं VectorDrawables के साथ नए पश्चगामी संगतता के साथ एक समस्या का सामना करना पड़ रहा है। समर्थन लाइब्रेरी 23.2 में Android VectorDrawables के साथ पिछड़े संगतता के लिए एक नई सुविधा थी।एंड्रॉयड चयनकर्ता Drawable srcCompat

मैं एक imageView जो एक SelectorDrawable करने के लिए सौंपा है। इस ड्रायलेबल में कई वेक्टर ड्रावेबल हैं इसलिए मैंने सोचा कि मुझे ऐप का उपयोग करना चाहिए: संगतता के लिए srcCompat। लेकिन यह एंड्रॉइड 4.1.2 के साथ मेरे गैलेक्सी एस 2 पर काम नहीं करता है।

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/ic_gps_fixed_24dp"android:state_activated="true" android:state_selected="true"></item> 
    <item android:drawable="@drawable/ic_gps_not_fixed_24dp" android:state_activated="true" android:state_selected="false"></item> 
    <item android:drawable="@drawable/ic_gps_not_fixed_24dp" android:state_activated="false" android:state_selected="true"></item> 
    <item android:drawable="@drawable/ic_gps_off_24dp" android:state_activated="false" android:state_selected="false"></item> 
    <item android:drawable="@drawable/ic_gps_not_fixed_24dp"></item> 
</selector> 

सभी ड्रायवर वेक्टर xml फ़ाइलें हैं।

srcCompat के साथ इस SelectorDrawable का उपयोग करते समय मैं इस त्रुटि मिलती है:

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ic_gps_fixed_24dp.xml from drawable resource ID #0x7f0201c1 
                      at android.content.res.Resources.loadDrawable(Resources.java:1951) 
                      at android.content.res.Resources.getDrawable(Resources.java:672) 
                      at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:173) 
                      at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:881).xml from drawable resource ID #0x7f0201c1 

एंड्रॉयड का उपयोग कर: src भी बदतर है।

अगर मैं अनुप्रयोग के साथ वेक्टर ड्रॉएबल में से एक का उपयोग करें: srcCompat सब ठीक काम करता है। तो मुझे लगता है कि यह SelectorDrawable और संगतता के साथ एक समस्या है।

को भी यही समस्या थी और एक समाधान पाया है या वर्तमान में संभव एंड्रॉयड 5 से पहले SelectorDrawables में VectorDrawables उपयोग करने के लिए नहीं है है?

त्वरित तथ्य:

  • संकलित लक्ष्य एपीआई 23
  • समर्थन Libraray 23.3.0
  • vectorDrawables.useSupportLibrary = सच
  • Gradle 2,0
+1

लोड करने के लिए सहायता श्रोत से वेक्टर ड्रॉएबल संस्करण 23.3 में हटा दिया गया था - https://plus.google.com/+AndroidDevelopers/posts/iTDmFiGrVne – Jahnold

+1

लेकिन: "का उपयोग अनुप्रयोग: srcCompat और setImageResource() काम करना जारी रखता है "तो ऐप: srcCompat अभी भी 23.3 में काम करना चाहिए। या नहीं? – marilion91

+2

हाँ ऐप का उपयोग करके: srcCompat अभी भी काम करता है ताकि आप एक वेक्टर ड्रावर को एक छवि दृश्य में सेट कर सकें। हालांकि किसी XML स्थिति सूची में ड्रॉबल्स लोड करना दुर्भाग्यवश – Jahnold

उत्तर

50

कुछ प्रश्न बदल गए हैं क्योंकि मैंने इस सवाल से पूछा है, इसलिए मैं इसे स्वयं जवाब दूंगा।

समर्थन लाइब्रेरी 23.4.0 के साथ

Ressources से VectorDrawables के लिए समर्थन पुन: सक्षम किया गया था: Android Support Library 23.4.0 available now

आप गूगल आई/ओ 2016 से इस फिल्म में है कि अधिक जानकारी प्राप्त कर सकते हैं: What's new in the support library - Google I/O 2016

आप की जरूरत है हर गतिविधि जहां आप Android 5.0 नीचे उपकरणों पर VectorDrawables उपयोग करना चाहते हैं (कोडनेम लॉलीपॉप, एपीआई स्तर 21) में जोड़ने के लिए:

static { 
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 
} 

तो अब कर सकते हैं DrawableContainers में वेक्टर ड्रावेबल्स का उपयोग करें, लेकिन यह अभी भी ऊपर दिए गए स्रोतों में उल्लिखित कुछ मुद्दों का कारण बन सकता है, इसलिए इसे सावधानी से उपयोग करें।

मैंने अब तक अपने ऐप में इस सुविधा को पुन: सक्षम नहीं किया है, लेकिन मैं अपने अगले प्रमुख रिलीज के साथ वेक्टर ड्रावेबल्स में अपने कई आइकनों को बदल दूंगा और फिर इस विषय में गहराई से गोता लगाऊंगा।

+0

इसके अलावा, निम्न बग रिपोर्ट सहायता की हो सकती है: https://code.google.com/p/android/issues/detail?id = 210745 और pageId = 109201119303080409719 –

+0

"आपको इसे प्रत्येक गतिविधि में जोड़ने की आवश्यकता है जहां आप एंड्रॉइड 5 के नीचे डिवाइस पर वेक्टर ड्रायबल्स का उपयोग करना चाहते हैं" सच नहीं है, हमें इसकी आवश्यकता है कि एंड्रॉइड 15 – stallianz

+8

@stallianz एंड्रॉइड 5 एपीआई स्तर 21 के बराबर है। एपीआई संस्करणों के साथ रिलीज संस्करणों को भ्रमित करें। – F43nd1r

33

के रूप में उल्लेख किया @Jahnold सवाल करने की टिप्पणी, एक एक्सएमएल राज्य xml सूची से वेक्टर ड्रॉइंग लोड करने के लिए समर्थन 23.3 में हटा दिया गया था।

हालांकि, मैं कई दृष्टिकोण मदद कर सकते हैं पाया।

1. टिंट

दृष्टिकोण से उपयुक्त है का उपयोग करता है, तो चयनित राज्य सूची अंतर से ड्रॉएबल केवल रंग से। ,

<?xml version="1.0" encoding="utf-8"?> 
<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:width="24dp" 
    android:height="24dp" 
    android:viewportWidth="24" 
    android:viewportHeight="24" 
    android:tintMode="multiply" 
    android:tint="@color/button_tint"> 

    <path 
     android:fillColor="#ffffff" 
     android:pathData="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/> 

    <path 
     android:pathData="M0 0h24v24H0z"/> 

</vector> 

दूसरा रंग राज्य सूची button_tint.xmlres/color

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:color="#555555" android:state_enabled="false"/> 
    <item android:color="#6699dd"/> 
</selector> 

में रखा मत भूलना build.gradle के अनुसरण की पंक्तियाँ जोड़ें बनाएँ:

पहले, टिंट और सफेद fillColor साथ केवल एक सदिश drawable बनाने या दृष्टिकोण पुराने एंड्रॉइड संस्करणों पर काम नहीं करेगा।

defaultConfig { 
    vectorDrawables.useSupportLibrary = true 
} 

2. बनाने StateListDrawable

दृष्टिकोण Hardcode उपयुक्त है अगर आप राज्य सूची वेक्टर ड्रॉएबल जो अंतर न केवल एक रंग, लेकिन यह भी एक आंकड़ा तो आप कई अलग अलग एक्सएमएल फ़ाइलों को बनाने की जरूरत से के लिए उपयोग ।फिर आप StateListDrawable प्रोग्रामेटिक रूप से answer में दिखाए जा सकते हैं।

+5

पर काम नहीं करता है, मुझे यह पता लगाने में एक घंटा व्यतीत होता है कि 'button_tint.xml' फ़ाइल'/res/color' फ़ोल्डर के अंतर्गत रखी जानी चाहिए। तो, इसे मत भूलना। –

+0

शायद आपको टिकाऊ में टिंट और टिंट मोड को परिभाषित नहीं करना चाहिए। यह drawables पुन: प्रयोज्यता को सीमित करता है। यदि डिजाइनर रंग बदलने का फैसला करता है, या एक ही आइकन है लेकिन अलग-अलग रंगों में, आपको शैली आदि का उपयोग करके इसे टिनटिंग करने के बजाय ड्रॉलेट करने की आवश्यकता होगी –

+0

@Gristopher पेरी इस मामले में आप दूसरे दृष्टिकोण का उपयोग कर सकते हैं। –

4

देखने के बाद समर्थन पुस्तकालय में नया क्या है - Google I/O 2016 मैंने AppCompatResources कक्षा में एक उपयोगी विधि देखी। यह AppCompatResources#getColorStateList(Context context, int resId) है। इस विधि की मदद से मैंने वेक्टर ड्रॉबल्स के साथ चयनकर्ता लागू किया है। यहाँ मेरी रंग चयनकर्ता फ़ाइल icon_selector है:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:color="@color/red_selected" android:state_selected="true"/> 
    <item android:color="@color/red_pressed" android:state_pressed="true"/> 
    <item android:color="@color/red"/> 
</selector> 

और वहाँ जावा विधि है कि रंगे drawable देता है:

private Drawable getTintedDrawable(@DrawableRes int drawableId) { 
    Drawable drawable; 
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { 
     drawable = getResources().getDrawable(drawableId, getTheme()); 
    } else { 
     drawable = getResources().getDrawable(drawableId); 
    } 
    drawable = DrawableCompat.wrap(drawable); 
    DrawableCompat.setTintList(drawable.mutate(), AppCompatResources.getColorStateList(this, R.color.selector_nav_bar_item_ico)); 
    return drawable; 
    } 

आप इसे

yourImageView.setImageDrawable(getTintedDrawable(R.drawable.ic_vector_image)); 
0

नीचे के साथ ठीक काम कर नीचे दिखाया गया है पसंद का उपयोग कर सकते परिवर्तन।

static { 
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 
} 

आवेदन कक्षा में जोड़ा गया। defaultConfig

अंदर
एप्लिकेशन build.gradle
vectorDrawables.useSupportLibrary = true 
संबंधित मुद्दे