प्री लॉलीपॉप क्रैश पर एंड्रॉइड वेक्टर ड्राएबल्स का उपयोग करना


91

मैं लॉलीपॉप से ​​पहले एंड्रॉइड में वेक्टर ड्राअब का उपयोग कर रहा हूं और ये मेरे कुछ पुस्तकालयों और टूल संस्करणों में हैं:

  • एंड्रॉइड स्टूडियो: 2.0
  • एंड्रॉइड ग्रैडल प्लगिन: 2.0.0
  • बिल्ड टूल्स: 23.0.2
  • एंड्रॉइड सपोर्ट लाइब्रेरी: 23.3.0

मैंने इस संपत्ति को अपने ऐप स्तर में जोड़ा है Build.Gradle

android {  
  defaultConfig {  
    vectorDrawables.useSupportLibrary = true  
   }  
}

यह भी ध्यान देने योग्य है कि मैं अतिरिक्त ड्रॉबल का उपयोग करता हूं जैसे कि लेयरड्रैबल (लेयर_लिस्ट) जैसा कि एंड्रॉइड ऑफिशियल ब्लॉग में कहा गया है ( लिंक यहां ) वेक्टर ड्रॉबल्स के लिए बाहर सेट करने के लिएapp:srcCompat

<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/search"/>
</level-list>

आपको ऐप के बाहर सीधे वेक्टर ड्रॉइंग संदर्भित होंगे: srcCompat लॉलीपॉप से ​​पहले विफल हो जाएगा। हालाँकि, AppCompat लोडिंग वेक्टर ड्रॉबल्स का समर्थन करता है, जब उन्हें एक अन्य ड्रॉएबल कंटेनर जैसे कि StateListDrawable, InsetDrawable, LayerDrawable, LevelListDrawable और RotateDrawable में संदर्भित किया जाता है। इस अप्रत्यक्ष का उपयोग करके , आप TextView के एंड्रॉइड: drawableLeft विशेषता जैसे मामलों में वेक्टर ड्राअब का उपयोग कर सकते हैं, जो सामान्य रूप से वेक्टर ड्रॉबल्स का समर्थन करने में सक्षम नहीं होगा।

जब मैं app:srcCompatसब कुछ ठीक काम करता हूं , लेकिन जब मैं उपयोग करता हूं:

android:background
android:drawableLeft
android:drawableRight
android:drawableTop
android:drawableBottom

पर ImageView, ImageButton, TextViewया EditTextलॉलीपॉप करने से पहले, यह एक expection फेंकता है:

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/search_toggle.xml from drawable resource ID #0x7f0200a9


कैसे drawableLeft, drawableRight, drawableTop, drawableBottom की जाँच के साथ VectorDrawable का उपयोग देखने के लिए इस उत्तर
Behzad Bahmanyar

क्या आप यहां मेरे उत्तर की जांच कर सकते हैं? stackoverflow.com/a/40523623/2557258
Yazon2006

मेरे मामले में, वैक्टर ड्रॉअल्स सही पैकेज (ओपन प्रोजेक्ट व्यू) में नहीं थे, यहां मूल जवाब stackoverflow.com/a/35836318/2163045
16

जवाबों:


102

नवीनतम अद्यतन - जून / 2019

मूल उत्तर के बाद से समर्थन पुस्तकालय थोड़ा बदल गया है। अब, यहां तक ​​कि ग्रेड के लिए एंड्रॉइड प्लगइन भी निर्माण समय पर स्वचालित रूप से पीएनजी उत्पन्न करने में सक्षम है। तो, नीचे दो नए दृष्टिकोण हैं जो इन दिनों काम करना चाहिए। आप अधिक जानकारी यहाँ पा सकते हैं :

पीएनजी पीढ़ी

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

मैं अपने ऐप में इस समाधान का उपयोग कर रहा हूं और ठीक काम करता हूं। कोई अतिरिक्त build.gradle ध्वज आवश्यक नहीं है। कोई हैक आवश्यक नहीं है। यदि आप / निर्माण / उत्पन्न / Res / pngs / ... आप सभी उत्पन्न PNGs देख सकते हैं।

इसलिए, यदि आपके पास कुछ सरल आइकन हैं (चूंकि सभी xml तत्व समर्थित नहीं हैं), तो यह समाधान आपके लिए काम कर सकता है। बस अपने एंड्रॉइड स्टूडियो और ग्रेड के लिए अपने एंड्रॉइड प्लगइन को अपडेट करें।

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

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

या हो सकता है, आप किसी भी PNG को उत्पन्न करने के लिए Android Studio नहीं चाहते हैं।

उस "ऑटो-पीएनजी पीढ़ी" से अलग, जो XML तत्व के सबसेट का समर्थन करता है, यह समाधान, सभी xml टैग का समर्थन करता है। तो, आपको अपने वेक्टर ड्रॉबल का पूरा समर्थन है।

आपको सबसे पहले, इसे बनाने के लिए अपने build.gradle को अपडेट करना होगा :

android {
  defaultConfig {
    // This flag will also prevents Android Studio from generating PNGs automatically
    vectorDrawables.useSupportLibrary = true
  }
}

dependencies {
  // Use this for Support Library
  implementation 'com.android.support:appcompat-v7:23.2.0' // OR HIGHER

  // Use this for AndroidX
  implementation 'androidx.appcompat:appcompat:1.1.0' // OR HIGHER
}

और फिर, का उपयोग app:srcCompatकरने के बजाय android:srcलोड करते समय VectorDrawables। यह मत भूलना।

के लिए TextView, आप उपयोग कर रहे हैं androidxसमर्थन लाइब्रेरी के संस्करण, आप उपयोग कर सकते हैं app:drawableLeftCompatके बजाय (ठीक है, ऊपर, नीचे या)app:drawableLeft

के मामले में CheckBox/ के बजाय का RadioButtonउपयोग करें ।app:buttonCompatandroid:button

आप उपयोग नहीं कर रहे हैं, तो androidxसमर्थन लाइब्रेरी और अपने के संस्करण minSdkVersionहै 17या उच्च या एक बटन का उपयोग कर, आप के माध्यम से प्रोग्राम के रूप में स्थापित करने के लिए कोशिश कर सकते हैं

Drawable icon = AppCompatResources.getDrawable(context, <drawable_id>);
textView.setCompoundDrawablesWithIntrinsicBounds(<leftIcon>,<topIcon>,<rightIcon>,<bottomIcon>);

अद्यतन - जुलाई / 2016

उन्होंने एंड्रॉइड सपोर्ट लाइब्रेरी 23.4.0 में वेक्टरड्राइव को फिर से सक्षम किया

AppCompat उपयोगकर्ताओं के लिए , हमने AppCompatDelegate.setCompatVectorFromResourceEnabled (सत्य) के माध्यम से संसाधनों (23.2 में पाया गया व्यवहार) से पुन: सक्षम वेक्टर को फिर से सक्षम करने के लिए एक ऑप्ट-इन एपीआई जोड़ा है - ध्यान रखें कि यह अभी भी स्मृति के उपयोग के साथ समस्याएँ पैदा कर सकता है और कॉन्फ़िगरेशन इंस्टेंसेस को अपडेट करने में समस्याएं, इसलिए यह डिफ़ॉल्ट रूप से अक्षम है।

हो सकता है , build.gradleसेटिंग अब अप्रचलित हो गई है और आपको इसे उचित गतिविधियों में सक्षम करने की आवश्यकता है (हालांकि, परीक्षण करने की आवश्यकता है)।

अब, इसे सक्षम करने के लिए, आपको यह करना होगा:

public class MainActivity extends AppCompatActivity {
    static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

    ...
}

मूल उत्तर - अप्रैल / 2016

मुझे लगता है कि यह इसलिए हो रहा है क्योंकि समर्थन वेक्टर नवीनतम लाइब्रेरी संस्करण में अक्षम था: 23.3.0

इस पोस्ट के अनुसार :

AppCompat उपयोगकर्ताओं के लिए, हमने 23.2.0 / 23.2.1 (ISSUE 205236) संस्करण में कार्यान्वयन में पाए जाने वाले मुद्दों के कारण पूर्व-लॉलीपॉप उपकरणों पर संसाधनों से वेक्टर ड्रॉबल्स का उपयोग करने वाले कार्यक्षमता को निकालने का निर्णय लिया है । एप्लिकेशन का उपयोग करना: srcCompat और setImageResource () काम करना जारी रखता है।

यदि आप ISSUE 205236 के मुद्दे पर जाते हैं , तो ऐसा लगता है कि वे भविष्य में सक्षम होंगे लेकिन स्मृति समस्या जल्द ही ठीक नहीं होगी:

अगली रिलीज़ में मैंने एक ऑप्ट-इन एपीआई जोड़ा है जहाँ आप वेक्टरड्राएबल समर्थन को फिर से सक्षम कर सकते हैं जिसे हटा दिया गया था। यह पहले की तरह ही कैवियट के साथ आता है (मेमोरी उपयोग और कॉन्फ़िगरेशन अपडेट के साथ समस्याएं)।

मेरा मुद्दा भी ऐसा ही था। इसलिए, मेरे मामले में, मैंने उन सभी आइकन को वापस कर दिया, जो संसाधन से PNG छवियों के लिए फिर से वेक्टर ड्रा करने योग्य का उपयोग करते हैं (चूँकि वे फिर से सक्षम करने के लिए एक विकल्प प्रदान करने के बाद भी मेमोरी इश्यू होते रहेंगे)।

मुझे यकीन नहीं है कि यह सबसे अच्छा विकल्प है, लेकिन यह मेरी राय में सभी दुर्घटनाओं को ठीक करता है।


1
धन्यवाद @Guilherme पी। लेकिन आपने बार- बार निर्माण समय पर pngsvectorDrawables.useSupportLibrary = true को सक्षम करने के लिए वापस जाने के लिए क्यों नहीं हटाया ?
बेहज़ाद बहमनियार

1
यह स्मृति समस्याओं के कारण नवीनतम संस्करण v23.3.0 में अक्षम किया गया था। इस तरह, वे रनटाइम पर png उत्पन्न नहीं कर सकते हैं ... यही कारण है कि logcat त्रुटि में वे प्रिंट करते हैं: अज्ञात टैग वेक्टर (या ऐसा कुछ)।
W0rmH0le

4
यहां ऑप्ट-इन निर्देश plus.google.com/+AndroidDevelopers/posts/B7QhFkWZ6YX है । दुर्भाग्य से वेक्टरड्रॉबल्स अभी भी प्री-लॉलीपॉप डिवाइस पर काम नहीं कर रहे हैं। मैं सपोर्ट लाइब्रेरी 23.4.0 पर हूं और दोनों में 'जेनरेटेंसिटीज = [] और' वेक्टरड्राएबल्स.यूजसपॉर्टलॉउल्ट्स = सच 'डिफॉल्टकॉन्फिग {} में हैं।
एडम हर्वित्ज

1
@AdamHurwitz मैंने उत्तर को अपडेट किया .. ऐसा लगता है कि इसे फिर से सक्षम किया गया था .. हालाँकि, आपको इसे अब अलग से सक्षम करना होगा।
W0rmH0le

1
@juztcode तुम सही हो। आपको 'androidx.appcompat: appcompat: 1.1.0' का उपयोग करना चाहिए
W0rmH0le

63

मुझे भी यही समस्या थी। लेकिन बहुत सारे R & D करने से मुझे जवाब मिल गया।

Imageview और ImageButton के उपयोग के लिए, app:srcCompat="@drawable/...." और बटन, टेक्स्टव्यू जैसे अन्य विचारों के लिए, "drawableLeft/right..."XML में उपयोग करने के बजाय, ड्राएबल्स को प्रोग्रामेटिक रूप से निर्दिष्ट करें:

button.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(mContext,R.drawable.ic_share_brown_18dp), null, null, null);

और ड्रॉ करने योग्य पाने के लिए "AppCompatResources" का उपयोग करें।


59

अन्य बहुत अच्छे उत्तरों के बारे में विस्तार से बताने के लिए , यहाँ एक चित्र है जो आपकी मदद कर सकता है। यदि आपके पास 23.4.0 से कम से कम 25.1.0 तक समर्थन लाइब्रेरी है, तो यह मान्य है।

वेक्टरड्राएबल चेटशीट


1
यदि आप ड्रा करने योग्य सेट करने का प्रयास कर रहे हैं, तो इसे एक ड्रॉबल के अंदर लपेटें जैसा कि यहां बताया गया है। medium.com/@chrisbanes/…
nizam.sp

धन्यवाद इस चार्ट से हमें बहुत मदद मिली।
मौलसुदो

39

Guillherme P का जवाब बहुत बढ़िया है। बस एक छोटा सा सुधार करने के लिए, आपको हर गतिविधि में उस पंक्ति को जोड़ने की आवश्यकता नहीं है, यदि आपने इसे एप्लिकेशन क्लास में एक बार जोड़ा है तो यह भी काम करेगा।

public class App extends Application {

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

याद रखें: आपको अब भी समर्थन लाइब्रेरी के उपयोग को सक्षम करने की आवश्यकता है:

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

इसके अलावा, सुनिश्चित करें कि आप v23.4 से अधिक एक समर्थन लाइब्रेरी संस्करण का उपयोग कर रहे हैं, जब Google ने वेक्टरड्रॉबल्स ( रिलीज़ नोट ) के लिए ड्राएबल कंटेनरों के लिए समर्थन वापस जोड़ा।

अपडेट करें

और कोड परिवर्तन के लिए:

  1. app:srcCompatहर उस जगह को अपडेट करना सुनिश्चित करें जो स्वीकार करता हैandroid:src विशेषता को (आईडीई आपको चेतावनी देगा कि क्या यह <bitmap>टैग के लिए अमान्य है )।
  2. के लिए drawableLeft, drawableStart, drawableRight, drawableEndमें प्रयोग किया जाता विशेषताओं TextViewऔर इसी तरह के विचारों, तो आप उन्हें अब के लिए प्रोग्राम के रूप में स्थापित करने के लिए होगा। सेटिंग का एक उदाहरण drawableStart:

    Drawable drawable = AppCompatResources.getDrawable(
            getContext(),
            R.drawable.your_vector_drawable);
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        textView.setCompoundDrawablesRelativeWithIntrinsicBounds(drawable, null, null, null);
    }

याद रखें कि आपको ढाल में वेक्टर ड्रॉब के लिए समर्थन पुस्तकालय के उपयोग की आवश्यकता है: VectorDrawables.useSupportLibrary = true
Benny

2
हां। मुझे पता है। लेकिन वेक्टर ड्रॉबल्स को टेक्सव्यू के लिए ड्रॉबल्स के रूप में काम करने के लिए एक आवरण आवश्यक है, इसलिए यह उत्तर अधूरा है।
cesards

1
बहुत बढ़िया जवाब। यह विशेष रूप से कस्टम बेस गतिविधि से विस्तारित इसकी सभी गतिविधियों वाले ऐप्स के लिए अच्छा है।
हांग

14

मुझे भी यही समस्या थी। और इसे हटाकर ठीक करें

vectorDrawables.useSupportLibrary = true

मेरा लक्ष्य संस्करण 25 है और समर्थन पुस्तकालय है

 compile 'com.android.support:appcompat-v7:25.3.1'

1
यह मेरे लिए काम किया। धन्यवाद। मैं तो बस हटा दिया किvectorDrawables.useSupportLibrary = true
एंड्रॉयड औसत दर्जे

मुझे लगता है कि यह ऐसा करने का उचित तरीका नहीं है, किसी भी तरह से मैंने आपके जवाब को छोड़ दिया है। !!
हरीश रेड्डी

धन्यवाद। t मेरे ऐप के लिए काम करता है। सभी सदिश आरेख अभी भी काम करते हैं यदि इसे हटा दिया गया है। ऐप कॉम का उपयोग करता है ।android.support:appcompat
Hong

10

प्री-लॉलीपॉप पर वेक्टरड्राइव का उपयोग किए बिना ठीक काम करना चाहिए

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

यदि आप ImageViews के अंदर वेक्टरड्राइव का उपयोग करना चाहते हैं, तो आप विशेषता का उपयोग कर सकते हैं srcCompat और यह काम करेगा, लेकिन बटन या TextViews के अंदर यह नहीं होगा , इसलिए आपको ड्रिबल को इनसेटड्राइव या लेयरड्रैबल में लपेटने की आवश्यकता है। एक और तरकीब है जो मैंने खोजी है, यदि आप डेटा बाइंडिंग का उपयोग कर रहे हैं, तो आप यह कर सकते हैं:

android:drawableLeft="@{@drawable/vector_ic_access_time_24px}"
android:drawableStart="@{@drawable/vector_ic_access_time_24px}"

यह जादुई रूप से काम करेगा, मैंने जांच नहीं की कि पर्दे के पीछे क्या हो रहा है, लेकिन मुझे लगता है कि TextView AppCompatResources या इसी तरह से getDrawable विधि का उपयोग कर रहा है।


चयनकर्ता में वेक्टर छवि कैसे सेट करें?
तुषार गोगना

वेक्टरडालवेबल्स सेट करने के बाद ।useSupportLibrary = gradle default में सच और AppCompatDelegate.setCompatVectorFromResourcesEnabled (true); एक्टिविटी ऑन क्रिएट : एंड्रॉइड के साथ क्रैश से बचने के लिए : टेक्स्टव्यू में ड्रॉएबलटेफ़ट , परीक्षा के लिए प्रोग्रामवॉच के लिए टेक्स्टव्यू के लिए ड्रॉबल सेट करें: textview.setCompoundDrawablesWithIntrinsicBounds (Rdrawable.movie, 0, 0, 0);
अफजलुर रहमान राणा

7

आर एंड डी के बहुत, अंत में पूर्व-लॉलीपॉप उपकरणों पर दुर्घटनाओं के लिए यह समाधान प्राप्त कर रहा है।

छवि के लिए

  • उपयोग एप्लिकेशन: Android के बजाय srcCompat : src

TextView / EditText के लिए

  • ड्रॉएबलटेफ़्ट , ड्रॉबलराइट को हटा दें .... और ड्रॉएबल जावा कोड से सेट करें।

txtview.setCompoundDrawablesWithIntrinsicBounds (AppCompatResources.getDrawable (EventDetailSinglePage.this, R.drawable.ic_done_blone_24_n), null, null, null);

बिल्ड.ग्रेड के लिए

VectorDrawables.useSupportLibrary = true


1
यह अनूठा समाधान था जिसने TextInputEditText पर काम किया।
heronsanches

1
Awsome, यह मेरी समस्या हल हो गई है। यह जवाब स्वीकार किया जाना चाहिए।
डीजेवती

6

सबसे आसान तरीका उपयोग:

app:drawableRightCompat ="@drawable/ic_mobilelogin"
app:drawableEndCompat="@drawable/ic_mobilelogin"
app:srcCompat="@drawable/ic_mobile"

और ... बस app:**Compatहमवतनता के लिए उपयोग करें । build.gradle(मॉड्यूल) पर भी समर्थन जोड़ें

android {
   defaultConfig {
       vectorDrawables.useSupportLibrary = true
   }
}

app: drawableEndCompat और app: drawableRightCompat बहुत कुछ एक ही बात है अगर इसके अंग्रेजी
Hossam Hassan

5

किसी के लिए जो एंड्रॉइड 3.0 और उससे अधिक के एंड्रॉइड अपग्रेड पर अपग्रेड करता है, उपयोग करने की कोई आवश्यकता नहीं है AppCompatDelegate.setCompatVectorFromResourcesEnabled(true), या सेट करें vectorDrawables.useSupportLibrary = true(इसे जोड़ें समस्या का कारण होगा) और उपयोग करेंapp:srcCompat , यह सिर्फ काम करता है।

यह पता लगाने के लिए मुझे दो दिन लग गए, और Google के डॉक्स में कोई संबंधित डॉक्स नहीं मिला ...


दिलचस्प है, मैं 3.3.0 ग्रेड का उपयोग कर रहा हूं और यह समाधान काम करता है। हालाँकि, एंड्रॉइड स्टूडियो अभी भी मुझे सेट वेक्टरड्रैबल्स.यूज़सुपोर्टलॉउंट्स = सत्य को सक्षम करने के लिए कह रहा है।
मास्टरवॉक

2

मैं प्री-लॉलीपॉप डिवाइसों पर वेक्टरड्रॉबल्स का उपयोग कर रहा हूं और यह है कि मैं यह कैसे करता हूं: -

चरण 1: इसे अपने ऐप स्तर के ग्रेडल में रखें।

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

चरण 2:

इसे अपने एप्लिकेशन वर्ग में रखें और अपनी एप्लिकेशन क्लास को मैनिफ़ेस्ट फ़ाइल में पंजीकृत करना न भूलें।

public class App extends Application {
    static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }
}

चरण 3:

वेक्टरड्रॉवल का उपयोग करके प्राप्त करें,

imageView.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.my_vector_drawable));

2

नीचे दिए गए कोड का उपयोग करने के बाद।

android {
  defaultConfig {
  vectorDrawables.useSupportLibrary = true  
                }
        }




public class App extends Application {
static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}}

फिर भी, नीचे की विशेषताओं के लिए वेक्टर छवियां मौजूद हैं

DrawableEnd, DrawableStart, DrawableTop, DrawableBottom, Background

इस मामले में, कृपया नीचे दिए गए तरीके का अनुसरण करें, वेक्टर छवि को संदर्भित करने के बजाय सीधे चयनकर्ता टैग का उपयोग मध्यवर्ती ड्रॉबल फ़ाइल के रूप में करें।

उदाहरण:

ic_warranty_icon.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="17dp"
android:height="24dp"
android:autoMirrored="true"
android:viewportWidth="17"
android:viewportHeight="24">

<path
    android:fillColor="#fff"
    android:pathData="M10.927,15.589l-1.549,0.355a7.47,7.47 0,0 1,-0.878 0.056c-4.136,0 -7.5,-3.364 -7.5,-7.5s3.364,-7.5 7.5,-7.5 7.5,3.364 7.5,7.5c0,3.286 -2.126,6.078 -5.073,7.089zM8.5,2a6.508,6.508 0,0 0,-6.5 6.5c0,3.583 2.917,6.5 6.5,6.5s6.5,-2.917 6.5,-6.5 -2.917,-6.5 -6.5,-6.5z" />

safe_ic_warranty_icon.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_warranty_icon"  />
</selector>

आपका टेक्स्ट व्यू / लेआउट।

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:drawableStart="@drawable/ic_warranty_icon"
       />


<LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_warranty_icon"
       />

धन्यवाद !!! पृष्ठभूमि की संपत्ति के लिए, वेक्टर ड्रिबल का उपयोग करने के बजाय सीधे बीच में चयनकर्ता को जोड़ने से प्री-लॉलीपॉप एपी (19) के लिए काम किया गया।
अंकुर

मेरे मामले में, यह अभी भी एपीआई के लिए काम नहीं करता है (16), यहां तक ​​कि साथ लपेटकरselector
मोचडवी

1

हमने 3 चीजों की कोशिश की

vectorDrawables.useSupportLibrary = true

SetCompatVectorFromResourcesEnabled अनुप्रयोग वर्ग में सेट करना

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

और उपयोग करें app:srcCompat

लेकिन इसके बाद भी यह असफल हो रहा था

Resources$NotFoundException: File res/drawable/$my_icon__0.xml from color state list resource ID #0x7f080008

तब हमें पता चला कि हमारे एसवीजी के पास ग्रेडिएंट टैग था। एपीआई <= 23 के नीचे अलग-अलग रास्तों के लिए ढाल टैग को बदलना और उसी एसवीजी एपीआई> = 24 का उपयोग करके काम किया।

इस उत्तर से सहायता प्राप्त करें https://stackoverflow.com/a/47783962/2171513


मैं नहीं जानता कि किसी ने इसे क्यों नहीं बढ़ाया, लेकिन यह वास्तव में मेरी समस्या का समाधान हो सकता है। धन्यवाद
DevMike01

0

बस सदिश ओवरलैप राज्य-सूची के लिए तो समस्या हल हो जाएगी

उदाहरण के लिए आपके पास वापस तीर वेक्टर छवि है:

ic_back_arrow.xml

हाँ, आपको इसे xml (ic_back_arrow_vector_vector.xml) सूची में परत करना चाहिए:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_back_arrow"/>
</layer-list>

क्योंकि तर्क:

vectorDrawables.useSupportLibrary = true

तथा

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

कुछ चीन उपकरणों और पुराने सैमसंग उपकरणों पर आपकी मदद नहीं करेगा। यदि आप उन्हें ओवरलैप नहीं करते हैं, तो यह विफल हो जाएगा।


0

मैं इसके लिए घंटों संघर्ष कर रहा था।

मैंने उन सभी उत्तरों की कोशिश की, जो इन उत्तरों ने मुझे बताए, लेकिन मेरा ऐप क्रैश होना बंद नहीं हुआ। मैंने यह लाइन हटा दी: app:srcCompat="@drawable/keyboard"और मेरा ऐप क्रैश होना बंद हो गया। और फिर जब मैंने इसी बात को वापस जोड़ा, तो यह फिर से दुर्घटनाग्रस्त हो गया। इसलिए मैंने उस फाइल को खोलने का फैसला किया और मैंने पहली पंक्ति में यह कहते हुए एक त्रुटि देखी

"ड्रॉबल 'कीबोर्ड में बेस ड्रॉबल फोल्डर में कोई घोषणा नहीं है; इससे क्रैश हो सकता है।

मैंने फ़ाइल को राइट-क्लिक किया और "एक्सप्लोरर में दिखाएँ" पर क्लिक किया और यह ड्रा करने योग्य फ़ोल्डर में नहीं बल्कि ड्रॉबल-वी 24 निर्देशिका में था। इसलिए मैंने इसे कॉपी किया और ड्रॉएबल डायरेक्टरी में पेस्ट किया और आखिरकार क्रैश से छुटकारा पाया।


-2

गुइलहर्म पी का सुझाव मेरे लिए काम नहीं कर रहा था। मैंने आगे बढ़कर पीएनजी का उपयोग करने का निर्णय लिया, जहां मुझे ऐप के बाहर चीजों को करने की आवश्यकता है: srcCompat यानी drawableLeft, drawableRight, आदि। यह बनाने के लिए एक बहुत ही आसान बदलाव था, और इसमें संभावित मेमोरी के मुद्दों को नहीं रखा गया है। सच); परिचय देता है।


-3

बेनी के जवाब का एक विकल्प एक Activityसुपरक्लास बनाना है :

public abstract class VectorDrawableActivity extends AppCompatActivity {
  static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
  }

  //...
}

के VectorDrawableActivityबजाय अब विस्तार करें AppCompatActivity


@ सिपाही क्यों नहीं?
कोड-अपरेंटिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.