Saat saya menggunakan aset VectorDrawable dalam textview atau imageview, saya mengalami error runtime saat menggunakan "android: DrawableRight" / "android: DrawableEnd" / "android: DrawableStart" / "android: DrawableLeft".
Aplikasi akan mengkompilasi dengan baik tanpa peringatan apa pun.
saya menggunakan
- Gradle 1.5
- Pustaka Dukungan 23.2 ('com.android.support:appcompat-v7:23.2.0')
Apa yang saya temukan adalah bahwa saya dapat menetapkan SVG secara terprogram di Java tanpa crash seperti ini.
TextView tv = (TextView) findViewById(R.id.textView);
tv.setCompoundDrawablesWithIntrinsicBounds(null,null, getResources().getDrawable(R.drawable.ic_accessible_white_36px),null);
(Saya menduga ini adalah bug pustaka dukungan untuk 23.2.)
Tetapi apakah mungkin menggunakan drawableRight dll untuk aset SVG?
Ini tata letak saya
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="au.com.angryitguy.testsvg.MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableRight="@drawable/ic_accessible_white_36px"
android:background="@color/colorPrimary"
android:textColor="#FFFFFF"
android:textSize="22sp"
android:text="Hello World!"/>
</RelativeLayout>
Inilah Aktivitas saya
package au.com.angryitguy.testsvg;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Berikut adalah aset VectorDrawable yang tidak dimodifikasi dari situs desain material Google.
<vector android:height="24dp" android:viewportHeight="24.0"
android:viewportWidth="24.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M12,4m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"/>
<path android:fillColor="#FFFFFF" android:pathData="M19,13v-2c-1.54,0.02 -3.09,-0.75 -4.07,-1.83l-1.29,-1.43c-0.17,-0.19 -0.38,-0.34 -0.61,-0.45 -0.01,0 -0.01,-0.01 -0.02,-0.01L13,7.28c-0.35,-0.2 -0.75,-0.3 -1.19,-0.26C10.76,7.11 10,8.04 10,9.09L10,15c0,1.1 0.9,2 2,2h5v5h2v-5.5c0,-1.1 -0.9,-2 -2,-2h-3v-3.45c1.29,1.07 3.25,1.94 5,1.95zM12.83,18c-0.41,1.16 -1.52,2 -2.83,2 -1.66,0 -3,-1.34 -3,-3 0,-1.31 0.84,-2.41 2,-2.83L9,12.1c-2.28,0.46 -4,2.48 -4,4.9 0,2.76 2.24,5 5,5 2.42,0 4.44,-1.72 4.9,-4h-2.07z"/>
</vector>
Ini adalah aplikasi saya build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "au.com.angryitguy.testsvg"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
// Stops the Gradle plugin’s automatic rasterization of vectors
generatedDensities = []
}
// Flag to tell aapt to keep the attribute ids around
aaptOptions {
additionalParameters "--no-version-vectors"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.0'
}
Ini kecelakaannya. (Perhatikan kesalahan pemekaran yang mereferensikan textview.)
java.lang.RuntimeException: Unable to start activity ComponentInfo{
au.com.angryitguy.testsvg/au.com.angryitguy.testsvg.MainActivity}:
android.view.InflateException: Binary XML file line #13:
Error inflating class TextView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
...
Caused by: android.view.InflateException:
Binary XML file line #13: Error inflating class TextView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
at au.com.angryitguy.testsvg.MainActivity.onCreate(MainActivity.java:14)
at android.app.Activity.performCreate(Activity.java:5008)
...
Caused by: android.content.res.Resources$NotFoundException:
File res/drawable/ic_accessible_white_36px.xml from drawable resource ID #0x7f02004b
at android.content.res.Resources.loadDrawable(Resources.java:1918)
at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
at android.widget.TextView.<init>(TextView.java:622)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:60)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:56)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103)
at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:963)
at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1022)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:675)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
at au.com.angryitguy.testsvg.MainActivity.onCreate(MainActivity.java:14)
at android.app.Activity.performCreate(Activity.java:5008)
...
Caused by: org.xmlpull.v1.XmlPullParserException:
Binary XML file line #1: invalid drawable tag vector
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:877)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:818)
at android.content.res.Resources.loadDrawable(Resources.java:1915)
at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
at android.widget.TextView.<init>(TextView.java:622)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:60)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:56)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103)
at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:963)
at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1022)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:675)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
at au.com.angryitguy.testsvg.MainActivity.onCreate(MainActivity.java:14)
at android.app.Activity.performCreate(Activity.java:5008)
...
Jawaban:
Iya
AppCompatTextView sekarang mendukung
app:drawableLeftCompat
,app:drawableTopCompat
,app:drawableRightCompat
,app:drawableBottomCompat
,app:drawableStartCompat
danapp:drawableEndCompat
digambar majemuk, pendukung yang backported jenis ditarik sepertiVectorDrawableCompat
.Sertakan ini dalam file gradle Anda
Dalam tampilan teks Anda, Anda dapat menggunakan
Jika Anda mengalami masalah saat menggunakan app: drawableLeftCompat, app: drawableStartCompat di tombol, Anda perlu memperbarui pustaka ke
androidx.appcompat: appcompat: 1.2.0-alpha01
mereka memiliki bug
androidx.appcompat: appcompat: 1.1.0-alpha01
Anda dapat melihat dokumennya
Atau jika Anda belum ingin memperbarui, maka:
Karena tampaknya Google tidak akan melakukan apa pun terkait masalah ini dalam waktu dekat, saya harus menemukan solusi yang lebih solid yang dapat digunakan kembali untuk semua aplikasi saya:
Pertama tambahkan atribut TextView kustom di file attrs.xml aplikasi Anda "res / values / attrs.xml" :
Kemudian buat kelas TextView kustom seperti ini:
Sekarang Anda dapat menggunakannya dengan mudah di tata letak apa pun dengan atribut khusus Anda:
Semoga ini membantu :)
sumber
vectorDrawables { useSupportLibrary = true }
daribuild.gradle
jawaban saya karena saran itu berhasil untuk saya.vectorDrawables useSupportLibrary = true
garis dari gradle. Saat Anda menghapusnya, Anda masih bisa meletakkan vektor di dalam tampilan Anda, tetapi mereka mengubah ukurannya dengan cara yang sama seperti png, yang berarti vektor akan melebar dan menjadi berbintik. Jika Anda ingin perangkat di bawah 5.0 / API21 benar-benar mengubah ukuran vektor dengan benar sehingga terlihat tajam, Anda harus menggunakan baris itu di dalam file gradle. Menempatkan baris itu memanggil IDE untuk menemukan area di mana Anda menggunakan vektor secara tidak benar dan kemudian Anda harus menggunakanapp:srcCompat
via XML atau mengaturnya melalui kode denganVectorDrawableCompat.create()
app:drawableEndCompat
untuk dukungan RTL yang lebih baik? PenyebabsetCompoundDrawablesRelativeWithIntrinsicBounds
membutuhkan setidaknya API level 17.Solusi ini tidak lagi tepat. Dari sumber daya dapat digambar versi 23.3.0 hanya dapat dimuat melalui app: srcCompat atau setImageResource ()
Cobalah untuk menggabungkan drawable vektor Anda ke dalam daftar lapisan atau selektor:
ic_accessible_white_wrapped.xml:
sumber
Cara terbaik yang saya temukan:
sumber
Drawable drawable = VectorDrawableCompat.create(getResources(), status.getIconResId(), wrapper.getTheme()); statusButton.setCompoundDrawablesRelativeWithIntrinsicBounds(null, drawable, null, null);
setCompoundDrawablesWithIntrinsicBounds
adalah 17 . Jika tidak, ini bekerja dengan baik.Untuk melengkapi beberapa jawaban di sini: Anda bisa membuat VectorDrawable berfungsi sebagai
drawableLeft
(dll.) Tetapi itu bergantung pada versi Pustaka Dukungan dan ada harganya.Dalam kasus apa ini berhasil? Saya telah membuat diagram ini untuk membantu (berlaku untuk Support Library 23.4.0 hingga - setidaknya - 25.1.0).
sumber
setCompatVectorFromResourcesEnabled
From 23.3.0 version vector drawables can only be loaded via app:srcCompat or setImageResource()
jadi solusi ini sudah usang dan tidak akan berfungsisetCompatVectorFromSourcesEnabled(true)
memungkinkan untuk memuat vectordrawables diandroid:background
Android 4.x. Jadi terima kasih! (Anda memang perlu membungkus vektor sebenarnya dalam satu daftar lapisan item)Tidak ada jawaban lain yang berfungsi, berikut cara saya menambahkan a
VectorDrawable
ke aTextView
, yang harus Anda gunakanVectorDrawableCompat.create()
saat menangani diVectorDrawables
bawah iniAndroid L
:Singkat, manis, dan langsung ke sasaran!
sumber
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
sumber
Anda dapat langsung menyetel vector drawable dalam xml, tetapi Anda telah menyertakan framework data binding.
Tulis saja
dan membungkus seluruh tata letak Anda dalam sebuah
<layout>
tag, jadi pada dasarnya xml Anda akan terlihat seperti:Untuk mengaktifkan kerangka data binding cukup tambahkan
Anda tidak perlu menggunakan fitur lain dari library binding
EDIT:
Tentu saja jika Anda ingin menggunakan vector drawable sebelum Lollipop Anda harus mengaktifkan dukungan vector drawable menggunakan
vectorDrawables.useSupportLibrary = true
Jadi Anda
build.gradle
membutuhkan 2 perintah baru:terima kasih kepada rkmax untuk komentarnya
sumber
vectorDrawables.useSupportLibrary
di app / build.gradle dan juga menambahkan AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) pada aktivitasbuild.gradle
yang mungkin menjadi alasan mengapa tidak berfungsiSaya memeriksa semua jawaban dan menggunakan Android studio 3.0.1 dan AppCompat Support Library 26.1.0 terbaru. Saya dapat memastikan ini berfungsi dengan baik.
Dalam file build.gradle (app)
Dan dalam Kegiatan memperluas
AppcompatActivity
termasuk metode luar ini yaitu satustatic
blokatau jika Anda ingin ini diterapkan ke seluruh aplikasi cukup sertakan baris ini di dalam kelas yang memperluas
Application
kelasTextview dalam xml
account_drawableleft_selector.xml
sumber
drawableRight
untukTextView
di XML?Pada androidx.appcompat: appcompat: 1.1.0 Anda dapat menggunakan
sumber
Saya sangat terlambat untuk menjawab pertanyaan ini karena saya terlambat mengatasi masalah ini. Saya memiliki masalah yang sama dengan drawable svg / vektor dengan TextView. Alih-alih membuat drawable khusus Anda sendiri, saya dapat memperbaiki masalah saya dengan 2 baris kode seperti di bawah ini:
Semoga ini akan membantu Anda.
sumber
L
perangkat pra .VectorDrawables
semua perangkat yang menjalankan pra-L, katakan saja. Berhati-hatilah saat menggunakan jawaban ini, karena ada API yang lebih aman dan lebih akurat untuk digunakan.Saya telah merancang pustaka kecil untuk ini - textview-rich-drawable (ini juga mendukung penentuan ukuran dan pewarnaan yang dapat digambar majemuk).
Dan ketergantungan
sumber
Jika Anda menggunakan binding, ada cara ajaib lain untuk memiliki pendekatan yang sama untuk menggunakan vektor dalam TextView. Membungkusnya seperti:
Itu akan bekerja secara ajaib, saya belum menyelidiki apa yang terjadi di balik layar, tapi saya kira TextView menggunakan
getDrawable
metode dariAppCompatResources
atau serupa.sumber
Berdasarkan jawaban Behzad Bahmanyar , saya perhatikan bahwa saya tidak dapat menggunakan atribut normal android untuk file png normal:
karena akan diganti dengan null in
jika
app:drawableTopCompat
tidak ditetapkan, tetapiandroid:drawableTop
(untuk misalnya).Inilah solusi lengkapnya:
sumber
Dalam file build.gradle (app)
...
gunakan (Saat Penyatuan Data)
Atau (Normal)
sumber
Menggunakan penggunaan Vector Drawable
kotlin
Jawa
sumber
Untuk penggunaan kompatibilitas mundur:
sumber
Saya menggunakan adaptor Binding untuk memecahkan Masalah ini
dan juga menggunakan cara ini dalam tata letak saya
mungkin vectorDrawables.useSupportLibrary = true dalam konfigurasi default diperlukan
sumber