การใช้ Android vector Drawables ในช่วงก่อน Lollipop crash


95

ฉันใช้ vector drawables ใน Android ก่อน Lollipopและนี่คือไลบรารีและเวอร์ชันเครื่องมือบางส่วนของฉัน:

  • Android Studio: 2.0
  • ปลั๊กอิน Android Gradle: 2.0.0.0
  • สร้างเครื่องมือ: 23.0.2
  • ไลบรารีการสนับสนุน Android: 23.3.0

ฉันเพิ่มคุณสมบัตินี้ในระดับแอปของฉัน Build.Gradle

android {  
  defaultConfig {  
    vectorDrawables.useSupportLibrary = true  
   }  
}

นอกจากนี้ยังควรค่าแก่การกล่าวถึงว่าฉันใช้สิ่งที่วาดได้พิเศษเช่น LayerDrawable (layer_list) ตามที่ระบุไว้ในบล็อกอย่างเป็นทางการของ Android ( ลิงค์ที่นี่ ) สำหรับการตั้งค่า drawables สำหรับ vector drawables นอกapp:srcCompat

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

คุณจะพบการอ้างอิงเวกเตอร์ที่วาดได้โดยตรงนอกแอป: srcCompat จะล้มเหลวก่อนที่ Lollipop อย่างไรก็ตาม AppCompat รองรับการโหลด vector drawables เมื่อมีการอ้างอิงในคอนเทนเนอร์ที่วาดได้อื่นเช่น StateListDrawable, InsetDrawable, LayerDrawable, LevelListDrawable และ RotateDrawable ด้วยการใช้ทิศทางนี้ คุณสามารถใช้ vector drawables ในกรณีเช่นแอตทริบิวต์ android: drawableLeft ของ TextView ซึ่งปกติจะไม่รองรับ vector drawables

เมื่อฉันใช้app:srcCompatทุกอย่างทำงานได้ดี แต่เมื่อฉันใช้:

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

บนImageView, ImageButton, TextViewหรือEditTextก่อนที่จะอมยิ้มก็พ่นคาดหวัง:

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

ความเข้ากันได้ของเวกเตอร์ Android
Adam Hurwitz

หากต้องการดูวิธีใช้ VectorDrawable กับ drawableLeft, drawableRight, drawableTop, drawableBottom โปรดดูคำตอบนี้
Behzad Bahmanyar

คุณช่วยตรวจสอบคำตอบของฉันที่นี่ได้ไหม stackoverflow.com/a/40523623/2557258
Yazon2006

ในกรณีของฉัน vactor drawables ไม่ได้อยู่ในแพ็คเกจที่ถูกต้อง (มุมมองโครงการแบบเปิด) คำตอบเดิมที่นี่stackoverflow.com/a/35836318/2163045
murt

คำตอบ:


104

อัปเดตล่าสุด - มิ.ย. / 2562

ไลบรารีการสนับสนุนมีการเปลี่ยนแปลงเล็กน้อยเนื่องจากคำตอบเดิม ตอนนี้แม้แต่ปลั๊กอิน Android สำหรับ Gradle ก็สามารถสร้าง PNG ได้โดยอัตโนมัติในเวลาสร้าง ดังนั้นด้านล่างนี้คือสองแนวทางใหม่ที่ควรใช้ในปัจจุบัน คุณสามารถดูข้อมูลเพิ่มเติมได้ที่นี่:

รุ่น PNG

Gradle สามารถสร้างภาพ PNG โดยอัตโนมัติจากเนื้อหาของคุณในเวลาสร้าง อย่างไรก็ตามในวิธีการนี้ไม่ได้ทั้งหมดองค์ประกอบ XML ได้รับการสนับสนุน วิธีนี้สะดวกเพราะคุณไม่จำเป็นต้องเปลี่ยนแปลงอะไรในโค้ดของคุณหรือใน build.gradle ของคุณ ตรวจสอบให้แน่ใจว่าคุณใช้Android Plugin 1.5.0 ขึ้นไปและAndroid Studio 2.2 ขึ้นไป

ฉันใช้โซลูชันนี้ในแอปของฉันและใช้งานได้ดี ไม่จำเป็นต้องใช้แฟล็ก build.gradleเพิ่มเติม ไม่จำเป็นต้องแฮ็ก หากคุณไปที่/ สร้าง / สร้าง / res / pngs / ...คุณจะเห็น PNG ที่สร้างขึ้นทั้งหมด

ดังนั้นหากคุณมีไอคอนง่ายๆ (เนื่องจากไม่รองรับองค์ประกอบ xml ทั้งหมด) โซลูชันนี้อาจเหมาะกับคุณ เพียงอัปเดต Android Studio และปลั๊กอิน Android สำหรับ Gradle

สนับสนุนไลบรารี

อาจเป็นวิธีแก้ปัญหาที่เหมาะกับคุณ หากคุณมาที่นี่แสดงว่า Android Studio ของคุณไม่ได้สร้าง PNG โดยอัตโนมัติ ดังนั้นแอปของคุณจึงขัดข้อง

หรือบางทีคุณไม่ต้องการให้ Android Studio สร้าง PNG เลย

แตกต่างจาก "การสร้าง PNG อัตโนมัติ" ซึ่งสนับสนุนองค์ประกอบ 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:buttonCompatแทนandroid:button.

หากคุณไม่ได้ใช้androidxรุ่นของห้องสมุดและการสนับสนุนของคุณminSdkVersionมี17หรือสูงกว่าหรือใช้ปุ่มคุณอาจพยายามที่จะตั้งค่าโปรแกรมผ่านทาง

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

อัพเดท - ก.ค. / 2559

พวกเขาเปิดใช้ VectorDrawable นั้นอีกครั้งใน
Android Support Library 23.4.0

สำหรับผู้ใช้ AppCompatเราได้เพิ่มเลือกใช้ API เพื่อเปิดใช้งานการสนับสนุน Vector Drawables จากทรัพยากรอีกครั้ง (ลักษณะการทำงานที่พบใน 23.2) ผ่าน AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) - โปรดทราบว่าสิ่งนี้ยังอาจทำให้เกิดปัญหากับการใช้หน่วยความจำและ ปัญหาในการอัปเดตอินสแตนซ์การกำหนดค่าด้วยเหตุนี้จึงปิดใช้งานโดยค่าเริ่มต้น

บางที , build.gradleการตั้งค่าอยู่ในขณะนี้ล้าสมัยและคุณเพียงแค่ต้องเปิดใช้งานในกิจกรรมที่เหมาะสม ( แต่จำเป็นที่จะต้องทดสอบ)

ตอนนี้เพื่อเปิดใช้งานคุณต้องทำ:

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

    ...
}

คำตอบเดิม - เมษายน / 2016

ฉันคิดว่าสิ่งนี้เกิดขึ้นเนื่องจาก Support Vector ถูกปิดใช้งานในไลบรารีเวอร์ชันล่าสุด: 23.3.0

ตามโพสต์นี้:

สำหรับผู้ใช้ AppCompat เราได้ตัดสินใจที่จะเอาฟังก์ชั่นที่ช่วยให้คุณใช้ภาพวาดเวกเตอร์จากแหล่งบนอุปกรณ์ก่อนอมยิ้มเนื่องจากปัญหาที่พบในการดำเนินการในรุ่น 23.2.0 / 23.2.1 (ฉบับที่ 205236) การใช้แอพ: srcCompat และ setImageResource () ยังคงทำงานต่อไป

หากคุณเข้าไปที่ปัญหาISSUE 205236ดูเหมือนว่าจะเปิดใช้งานในอนาคต แต่ปัญหาหน่วยความจำจะไม่ได้รับการแก้ไขในเร็ว ๆ นี้

ในรุ่นถัดไปฉันได้เพิ่ม API การเลือกใช้ซึ่งคุณสามารถเปิดใช้งานการสนับสนุน VectorDrawable อีกครั้งซึ่งถูกลบออกไป มันมาพร้อมกับคำเตือนเหมือนเดิม (การใช้หน่วยความจำและปัญหาเกี่ยวกับการอัปเดตการกำหนดค่า)

ฉันมีปัญหาที่คล้ายกัน ดังนั้นในกรณีของฉันฉันเปลี่ยนไอคอนทั้งหมดที่ใช้เวกเตอร์ที่วาดได้จากทรัพยากรเป็นรูปภาพ PNG อีกครั้ง (เนื่องจากปัญหาหน่วยความจำจะยังคงเกิดขึ้นแม้ว่าจะมีตัวเลือกให้เปิดใช้งานอีกครั้งก็ตาม)

ฉันไม่แน่ใจว่านี่เป็นตัวเลือกที่ดีที่สุดหรือไม่ แต่จะแก้ไขข้อขัดข้องทั้งหมดในความคิดของฉัน


1
ขอบคุณ @Guilherme P. แต่ทำไมคุณไม่ลบvectorDrawables.useSupportLibrary = trueperoperty เพื่อกลับไปเปิดใช้งานการสร้าง png ในเวลาสร้างอีกครั้ง
Behzad Bahmanyar

1
ที่ถูกปิดใช้งานในเวอร์ชันล่าสุด v23.3.0 เนื่องจากปัญหาหน่วยความจำ ด้วยวิธีนี้พวกเขาไม่สามารถสร้าง png ที่รันไทม์ได้ ... นั่นคือสาเหตุที่ทำให้เกิดข้อผิดพลาด logcat ที่พิมพ์: เวกเตอร์แท็กที่ไม่รู้จัก (หรืออะไรทำนองนั้น)
W0rmH0le

4
นี่คือเลือกในคำแนะนำplus.google.com/+AndroidDevelopers/posts/B7QhFkWZ6YX ขออภัย VectorDrawables ยังไม่ทำงานบนอุปกรณ์ Pre-Lollipop ฉันใช้ Support Library 23.4.0 และมีทั้ง 'createdDensities = []' และ 'vectorDrawables.useSupportLibrary = true' ที่เรียกใน defaultConfig {}
Adam Hurwitz

1
@AdamHurwitz ฉันอัปเดตคำตอบแล้ว .. ดูเหมือนว่าจะเปิดใช้งานอีกครั้ง .. อย่างไรก็ตามตอนนี้คุณต้องเปิดใช้งานต่างออกไป
W0rmH0le

1
@juztcode คุณพูดถูก คุณควรใช้ 'androidx.appcompat: appcompat: 1.1.0'
W0rmH0le

63

ผมมีปัญหาเหมือนกัน. แต่การทำ R&D จำนวนมากฉันได้รับคำตอบ

สำหรับการใช้ Imageview และ ImageButton app:srcCompat="@drawable/...." และสำหรับมุมมองอื่น ๆ เช่น Button, Textview แทนที่จะใช้"drawableLeft/right..."ใน XML ให้ระบุ drawables โดยใช้โปรแกรมเป็น:

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

และใช้ "AppCompatResources" เพื่อรับสิ่งที่เบิกได้


60

เพื่ออธิบายรายละเอียดเกี่ยวกับคำตอบที่ดีอื่น ๆนี่คือแผนภาพที่สามารถช่วยคุณได้ ใช้ได้ถ้าคุณมี Support Library ตั้งแต่ 23.4.0 ถึงอย่างน้อย 25.1.0

Cheatsheet VectorDrawable


1
ในกรณีที่คุณพยายามตั้งค่า drawableLeft ห่อไว้ใน drawable ตามที่กล่าวไว้ที่นี่ medium.com/@chrisbanes/…
nizam.sp

ขอบคุณแผนภูมินี้ช่วยเราได้มาก
silentsudo

39

คำตอบจากGuillherme Pนั้นยอดเยี่ยมมาก เพื่อทำการปรับปรุงเล็กน้อยคุณไม่จำเป็นต้องเพิ่มบรรทัดนั้นในทุกกิจกรรมหากคุณเพิ่มหนึ่งครั้งในคลาสแอปพลิเคชันก็จะได้ผลเช่นกัน

public class App extends Application {

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

ข้อควรจำ: คุณยังต้องเปิดใช้งานการใช้ไลบรารีการสนับสนุนใน gradle:

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณใช้ไลบรารีการสนับสนุนเวอร์ชันที่มากกว่า v23.4 เมื่อ Google เพิ่มการสนับสนุน Drawable Containers for VectorDrawables ( บันทึกประจำรุ่น )

อัปเดต

และสำหรับการเปลี่ยนแปลงรหัส:

  1. อย่าลืมอัปเดตapp:srcCompatทุกที่ที่ยอมรับandroid:srcแอตทริบิวต์ (IDE จะเตือนคุณหากไม่ถูกต้องเหมือนกับ<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);
    }
    

จำไว้ว่าคุณต้องมีการใช้ไลบรารีสนับสนุนสำหรับ vector drawables ใน gradle: vectorDrawables.useSupportLibrary = true
Benny

2
ใช่. ฉันรู้ว่า. แต่จำเป็นต้องมี wrapper เพื่อให้ vector drawables ทำงานเป็น drawables สำหรับ TexViews ดังนั้นคำตอบนี้จึงไม่สมบูรณ์
cesards

1
คำตอบที่ดี เหมาะอย่างยิ่งสำหรับแอปที่มีกิจกรรมทั้งหมดที่ขยายจากกิจกรรมพื้นฐานที่กำหนดเอง
Hong

14

ผมมีปัญหาเหมือนกัน. และแก้ไขได้โดยการลบ

vectorDrawables.useSupportLibrary = true

เวอร์ชันเป้าหมายของฉันคือ 25 และไลบรารีสนับสนุนคือ

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

1
สิ่งนี้ได้ผลสำหรับฉัน ขอบคุณ. ฉันเพิ่งลบมันออกไปvectorDrawables.useSupportLibrary = true
Android Mediocre

ฉันคิดว่านี่ไม่ใช่วิธีที่เหมาะสมที่จะทำไม่ว่าจะด้วยวิธีใดฉันก็ยอมแพ้กับคำตอบของคุณ !!
Harish Reddy

ขอบคุณ. t ใช้ได้กับแอปของฉัน เวกเตอร์ drawables ทั้งหมดยังคงใช้งานได้หากถูกลบออก แอปนี้ใช้ com.android.support:appcompat-v7:28.0.0
ฮ่องกง

10

VectorDrawables บน pre-lollipop ควรทำงานได้ดีโดยไม่ต้องใช้

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

หากคุณต้องการใช้ VectorDrawables ภายใน ImageViews คุณสามารถใช้แอตทริบิวต์srcCompatและจะใช้งานได้ แต่ภายใน Buttons หรือ TextViews จะใช้ไม่ได้ดังนั้นคุณต้องรวม Drawable ไว้ใน InsetDrawable หรือ LayerDrawable มีเคล็ดลับอีกอย่างที่ฉันค้นพบหากคุณใช้การผูกข้อมูลคุณสามารถทำได้:

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

มันจะใช้งานได้อย่างน่าอัศจรรย์ฉันไม่ได้ตรวจสอบสิ่งที่เกิดขึ้นเบื้องหลัง แต่ฉันเดาว่า TextView ใช้เมธอด getDrawable จาก AppCompatResources หรือที่คล้ายกัน


วิธีตั้งค่าภาพเวกเตอร์ในตัวเลือก
Tushar Gogna

หลังจากตั้งค่าvectorDrawables.useSupportLibrary = trueใน gradle default และ AppCompatDelegate.setCompatVectorFromResourcesEnabled (true); ในกิจกรรมสร้างเพื่อหลีกเลี่ยงความผิดพลาดกับandroid: drawableleft ใน Textviewให้ตั้งค่า drawble ทางซ้ายไปที่ textview โดยทางโปรแกรมสำหรับการทดสอบ: textview.setCompoundDrawablesWithIntrinsicBounds (R.drawable.movie, 0, 0, 0);
Afjalur Rahman Rana

7

R & d จำนวนมากในที่สุดก็ได้รับโซลูชันนี้สำหรับข้อขัดข้องบนอุปกรณ์ pre-lollipop

สำหรับ Imageview

  • ใช้แอพ: srcCompatแทน android: src

สำหรับ TextView / EditText

  • ลบdrawableleft , drawableright .... และตั้งค่าจากรหัส java ที่วาดได้

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

สำหรับ Build.gradle

vectorDrawables.useSupportLibrary = true


1
เป็นโซลูชันเฉพาะที่ทำงานบน TextInputEditText
heronsanches

1
แย่มากนี่สามารถแก้ปัญหาของฉันได้นี่ควรเป็นคำตอบที่ยอมรับได้
DJtiwari

7

วิธีใช้ที่ง่ายที่สุด:

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

สำหรับใครที่อัพเกรดเป็น android gradle 3.0 ขึ้นไปไม่จำเป็นต้องใช้AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)หรือตั้งค่าvectorDrawables.useSupportLibrary = true(เพิ่มสิ่งนี้จะทำให้เกิดปัญหา) และใช้app:srcCompatงานได้

ใช้เวลาสองวันในการคิดออกและไม่พบเอกสารที่เกี่ยวข้องในเอกสารของ Google ...


น่าสนใจฉันใช้ gradle 3.3.0 และวิธีนี้ใช้ได้ผล อย่างไรก็ตาม Android Studio ยังคงบอกให้ฉันเปิดใช้งาน set vectorDrawables.useSupportLibrary = true
masterwok

2

ฉันใช้ VectorDrawables บนอุปกรณ์ Pre-lollipop และนี่คือวิธีที่ฉันทำ: -

ขั้นตอนที่ 1: ใส่สิ่งนี้ไว้ในระดับแอปของคุณ

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

ขั้นตอนที่ 2:

ใส่สิ่งนี้ในคลาส Application ของคุณและอย่าลืมลงทะเบียนคลาส Application ของคุณในไฟล์ manifest

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

ขั้นตอนที่ 3:

รับ VectorDrawables โดยใช้

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, พื้นหลัง

ในกรณีนี้โปรดปฏิบัติตามด้านล่างแทนที่จะอ้างอิงภาพเวกเตอร์โดยตรงให้ใช้แท็กตัวเลือกเป็นไฟล์ที่วาดได้ระดับกลาง

ตัวอย่าง:

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 / Layout ของคุณ

<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"
       />

ขอบคุณ !!! สำหรับคุณสมบัติพื้นหลังการเพิ่มตัวเลือกระหว่างแทนที่จะใช้ vector drawable ใช้งานได้กับ api ก่อนอมยิ้ม (19)
Ankur

ในกรณีของฉันสิ่งนี้ยังใช้ไม่ได้กับ API (16) แม้จะห่อด้วยselector
mochadwi

1

เราลอง 3 อย่าง

vectorDrawables.useSupportLibrary = true

การตั้งค่า setCompatVectorFromResourcesEnabled ในคลาส Application

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

และการใช้งาน app:srcCompat

แต่หลังจากนั้นก็ล้มเหลวด้วย

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

จากนั้นเราพบว่า SVG ของเรามีแท็ก Gradient การแปลงแท็กการไล่ระดับสีเป็นแต่ละเส้นทางสำหรับด้านล่าง API <= 23 และใช้ SVG API> = 24 เหมือนกัน

ได้รับความช่วยเหลือจากคำตอบนี้https://stackoverflow.com/a/47783962/2171513


ฉันไม่รู้ว่าทำไมไม่มีใครโหวตเรื่องนี้ แต่นี่อาจเป็นวิธีแก้ปัญหาของฉัน ขอบคุณ
DevMike01

1

ฉันดิ้นรนกับเรื่องนี้เป็นเวลาหลายชั่วโมง

ฉันลองทำทุกอย่างที่คำตอบเหล่านี้บอก แต่แอปของฉันไม่หยุดขัดข้อง ฉันลบบรรทัดนี้: app:srcCompat="@drawable/keyboard"และแอพของฉันหยุดขัดข้อง แล้วเมื่อฉันเพิ่มสิ่งเดียวกันนี้กลับเข้าไปมันก็เริ่มหยุดทำงานอีกครั้ง ดังนั้นฉันจึงตัดสินใจเปิดไฟล์นั้นและฉันเห็นข้อผิดพลาดที่บรรทัดแรกว่า

"แป้นพิมพ์" แบบวาดได้ไม่มีการประกาศในโฟลเดอร์ฐานวาดได้ซึ่งอาจทำให้เกิดปัญหาได้

ฉันคลิกขวาที่ไฟล์และคลิก "Show in explorer" และมันไม่ได้อยู่ในโฟลเดอร์ drawable แต่อยู่ในไดเร็กทอรี drawable-v24 ดังนั้นฉันจึงคัดลอกและวางลงในไดเร็กทอรี drawable และในที่สุดก็กำจัดข้อขัดข้อง


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);

จะไม่ช่วยคุณในอุปกรณ์จีนบางรุ่นและอุปกรณ์ซัมซุงรุ่นเก่า หากคุณไม่ซ้อนทับกันมันจะล้มเหลว


-2

คำแนะนำของ Guilherme P ไม่ได้ผลสำหรับฉัน ฉันตัดสินใจใช้ png ที่ฉันต้องทำสิ่งต่าง ๆ นอกแอพ: srcCompat เช่น drawableLeft, drawableRight ฯลฯ นี่เป็นการเปลี่ยนแปลงที่ค่อนข้างง่ายและไม่มีปัญหาหน่วยความจำที่อาจเกิดขึ้น AppCompatDelegate.setCompatVectorFromResourcesEnabled ( จริง); แนะนำ.


-3

อีกทางเลือกหนึ่งสำหรับคำตอบของ Bennyคือการสร้างActivitysuperclass:

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

  //...
}

ตอนนี้ขยายVectorDrawableActivityแทนAppCompatActivity.


@cesards ทำไมไม่?
Code-Apprentice
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.