ความแตกต่างระหว่าง app: srcCompat และ android: src ใน XML เค้าโครงของ Android


142

เมื่อใดก็ตามที่ฉันสร้าง ImageView พร้อมไอคอนที่เพิ่มโดยใช้ Vector Assets ของ Android Studio ฉันได้รับข้อผิดพลาดที่บรรทัด app:srcCompat="@drawable/ic_play"

เมื่อฉันเปลี่ยนapp:srcCompatด้วยandroid:srcข้อผิดพลาดจะหายไป แต่ไอคอนดูเป็นพิกเซล

อะไรคือความแตกต่างที่สำคัญระหว่าง

app:srcCompat="@drawable/ic_play"

และ

android:src="@drawable/ic_play"

คำตอบ:


145

แอป: srcCompat

เป็นวิธีที่ไม่สามารถเข้าใจผิดได้มากที่สุดในการรวมvector drawablesเข้ากับแอปของคุณเวกเตอร์ drawablesช่วยให้คุณสามารถแทนที่เนื้อหา png หลายรายการด้วยกราฟิกแบบเวกเตอร์เดียวซึ่งกำหนดใน XML ในขณะที่ก่อนหน้านี้ จำกัด เฉพาะ Lollipop และอุปกรณ์ที่สูงกว่า

บันทึก

ในฐานะของAndroid สนับสนุนห้องสมุด 23.3.0 , ภาพวาดเวกเตอร์สนับสนุนapp:srcCompatสามารถโหลดได้ผ่านทาง

คุณต้องเพิ่มvectorDrawables.useSupportLibrary = trueลงในbuild.gradleไฟล์ของคุณ

    // Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }  

Android: src

ตั้งค่า drawable เป็นเนื้อหาของ ImageView นี้ซึ่งจะแสดงในขนาดดั้งเดิม ไม่มีการปรับขนาดอัตโนมัติ


2
ข้อผิดพลาดกับแอป: srcCompact หายไปเมื่อเพิ่ม vectorDrawables.useSupportLibrary = true ในโมดูลแอป Gradle
Zayid Mohammed

3
แอพ: srcCompat จะขัดแย้งกับ Android เวอร์ชันเก่าหรือไม่ โดยเฉพาะอย่างยิ่ง Api 19 เป็นเวอร์ชันที่เก่าที่สุดที่ฉันหมายถึง
Equivocal

ว้าวสามารถกำจัดไอคอนบิตแมปได้ในที่สุด
Meow Cat 2012

ลิงก์โพสต์ของ Google Plus หมดแล้ว
Vadim Kotov

ฉันได้เพิ่มไว้ด้านบนbuild.gradleแล้ว แต่ยังใช้งานไม่ได้มีความคิดใดบ้าง
David Callanan

21

หากคุณใช้android:src="@drawable/some_vector"โดยไม่ได้vectorDrawables.useSupportLibrary = trueอยู่ในไฟล์ build.gradle และแอพของคุณมีภาพเวกเตอร์ (vector drawable) จากนั้นในขณะที่สร้างไฟล์apkปลั๊กอิน Android gradle จะสร้างไฟล์ * .png จำนวนมากสำหรับหน้าจอต่างๆ (hdpi, xhdpi ... ) เวกเตอร์แต่ละตัววาดได้ (เฉพาะสำหรับ API = <19) ผล - ขนาดใหญ่apk

เมื่อใช้app:srcCompat="@drawable/some_vector"กับvectorDrawables.useSupportLibrary = trueAndroid ใช้ไฟล์เวกเตอร์ที่วาดได้โดยไม่ต้องสร้าง*.pngไฟล์

คุณสามารถตรวจสอบได้ด้วยเครื่องมือวิเคราะห์ Android Studio apk เพียงแค่สร้าง apk vectorDrawables.useSupportLibrary = trueที่มีและไม่มี

ฉันคิดว่านี่คือความแตกต่างหลัก ๆ


ดังนั้นหากคุณตั้ง useSupportLibrary เป็น true ทำไมคุณถึงต้องการไวยากรณ์พิเศษแทนที่จะเป็น android: src =? หากคุณใช้ android: src = โดยใช้ useSupportLibrary เปิดใช้งานคุณจะหลีกเลี่ยงการแพร่กระจายของ PNGs หรือไม่?
ออสการ์

9

ใช้:

app:srcCompat="@drawable/backImage"

แอตทริบิวต์ srcCompat ถูกกำหนดไว้ในไลบรารี AppCompat สำคัญ: คุณจะต้องเพิ่มเนมสเปซที่เหมาะสมสำหรับสิ่งนี้

xmlns:app="http://schemas.android.com/apk/res-auto"

บันทึก

สิ่งที่คุณได้รับดูเหมือนจะเป็นเพียงข้อผิดพลาดของผ้าสำลีที่สามารถละเลยได้ ฉันได้ลองและได้รับข้อผิดพลาดเดียวกัน แต่ทำงานได้อย่างถูกต้อง

คุณสามารถใช้tools:ignore="MissingPrefix"เพื่อหลีกเลี่ยงข้อผิดพลาดนี้ชั่วคราว

ฉันหวังว่านี่จะช่วยได้.


6

เมื่อใช้AppCompatกับImageView(หรือ subclasses เช่นImageButtonและFloatingActionButton) คุณจะสามารถที่จะใช้ใหม่app:srcCompatแอตทริบิวต์ภาพวาดอ้างอิงเวกเตอร์ในรุ่นเก่าของแพลตฟอร์ม (เช่นเดียวกับ drawable อื่น ๆ ที่สามารถใช้ได้android:src )

android.support.v7.appcompat.R.attr.srcCompat :

srcCompat

ตั้งค่า drawable เป็นเนื้อหาของ ImageView นี้ อนุญาตให้ใช้เวกเตอร์ที่วาดได้เมื่อทำงานบนแพลตฟอร์มเวอร์ชันเก่า

อาจจะมีการอ้างอิงไปยังทรัพยากรอื่นในรูปแบบหรือแอตทริบิวต์รูปแบบในรูปแบบ"@[+][package:]type/name""?[package:]type/name"


อย่าลืมเพิ่มเมื่อใช้งานxmlns:app="http://schemas.android.com/apk/res-auto"app:srcCompat


4

เวกเตอร์และเวกเตอร์แบบเคลื่อนไหวได้รับการสนับสนุนในเฟรมเวิร์กเวอร์ชันล่าสุดเท่านั้น srcCompat สามารถใช้กับไลบรารีความเข้ากันได้เพื่อให้ใช้งานได้ แต่ใช้ได้กับบางมุมมองในไลบรารีการสนับสนุนเท่านั้น สังเกตว่า app: ใช้แทน android:. ซึ่งหมายความว่าไม่ใช่ส่วนหนึ่งของกรอบงาน แต่เป็นพารามิเตอร์ที่กำหนดโดยแอปของคุณ


3
app:srcCompat="some_resource" 

อ้างว่าเป็น AppCompatActivity src ซึ่งมาในไลบรารีสนับสนุนในขณะที่

android:src="some_resource"

หมายถึงกิจกรรมง่ายๆ


3

เมื่อใช้AppCompatกับImageView(หรือคลาสย่อยเช่นImageButtonและFloatingActionButton) คุณจะสามารถใช้app:srcCompatแอตทริบิวต์ใหม่เพื่ออ้างอิง vector drawables (เช่นเดียวกับอื่น ๆ ที่สามารถวาดได้android:src) และหากคุณเปลี่ยน drawables ในขณะรันไทม์คุณจะสามารถใช้setImageResource()วิธีการเดิมได้เหมือนเดิม

การใช้AppCompatและapp:srcCompatเป็นวิธีที่ไม่สามารถเข้าใจผิดได้มากที่สุดในการรวมเวกเตอร์ drawables เข้ากับแอปของคุณ คุณจะพบว่าเวกเตอร์โดยตรงอ้างอิง Drawables นอกapp:srcCompatจะล้มเหลวก่อนที่จะอมยิ้ม


1

Android 5.0 (API ระดับ 21) และสูงกว่าให้การสนับสนุน vector drawable ดังนั้นเพื่อรองรับ vector drawables ในแอปเวอร์ชันเก่า: เพิ่ม srcCompat

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