是否可以使用 android: DrawableRight 在 Buttons 和 TextView 中使用 VectorDrawable?

当我在文本视图或图像视图中使用 VectorDrawable 资产时,当我使用“ android: DrawableRight”/“ android: DrawableEnd”/“ android: DrawableStart”/“ android: DrawableLeft”时,会出现运行时崩溃。

该应用程序将编译没有任何警告。

我在吸毒

  • 1.5级
  • 支持库23.2(‘ com.android.Support: appcompat-v7:23.2.0’)

但是我发现,我可以通过编程方式在 Java 中分配 SVG,而不会出现这样的崩溃。

TextView tv = (TextView) findViewById(R.id.textView);
tv.setCompoundDrawablesWithIntrinsicBounds(null,null, getResources().getDrawable(R.drawable.ic_accessible_white_36px),null);

(我怀疑这是一个支持23.2版本的库错误。)

但是是否可以对 SVG 资产使用 draableRight 等?

这是我的布局

<?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>

这是我的活动

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


}
}

以下是来自 Google 材料设计网站的未经修改的 VectorDrawable 资产。

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

这是我的应用程序编译

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'
}

这里是崩溃。(注意引用文本视图的膨胀错误。)

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)
...
72669 次浏览

这个解决方案不再正确,从23.3.0版本向量绘制只能通过 app: srcCompat 或 setImageResource ()加载

试着把你的矢量图包装成图层列表或者选择器:

<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableRight="@drawable/ic_accessible_white_wrapped"
android:background="@color/colorPrimary"
android:textColor="#FFFFFF"
android:textSize="22sp"
android:text="Hello World!"/>

Ic _ access _ white _  包裝. xml:

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

来自 Google: 截至 Android 支持库23.3.0,支持向量 只能通过 app: srcCompat 或 setImageResource ()加载可画性。

Http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

可以在 xml 中直接设置向量绘制,但是必须包含数据绑定框架。

写吧

<TextView
...
android:drawableRight="@{@drawable/ic_accessible_white_36px}"/>

并将整个布局包装在 <layout>标记中,因此基本上您的 xml 看起来像:

<?xml version="1.0" encoding="utf-8"?>
<layout>


<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:background="@color/colorPrimary"
android:drawableRight="@{@drawable/ic_accessible_white_36px}"
android:text="Hello World!"
android:textColor="#FFFFFF"
android:textSize="22sp"/>
</RelativeLayout>
</layout>

要激活数据绑定框架,只需添加

android {
....
defaultConfig {
dataBinding {
enabled = true
}
}
}

您不必使用绑定库的任何其他特性

编辑:

当然,如果你想使用矢量绘图前棒棒糖你必须启用支持矢量绘图使用

vectorDrawables.useSupportLibrary = true

所以你的 build.gradle需要两个新命令:

android {
....
defaultConfig {
vectorDrawables.useSupportLibrary = true
dataBinding {
enabled = true
}
}
}

感谢 Rkmax的评论

是否可以对 SVG 资产使用 draableRight 等?

是的

AppCompatTextView 现在支持 app:drawableLeftCompatapp:drawableTopCompatapp:drawableRightCompatapp:drawableBottomCompatapp:drawableStartCompatapp:drawableEndCompat复合绘图,支持后端移植的绘图类型,如 VectorDrawableCompat

把这个写进你的档案里

implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'

在文本视图中,可以使用

app:drawableLeftCompat
app:drawableStartCompat

如果在使用 app: draableLeftCompat,app: draableStartCompat 按钮时遇到问题,则需要将库更新为

Appcompat: appcompat: 1.2.0-alpha01

他们装了窃听器

Appcompat: appcompat: 1.1.0-alpha01

你可以看到 医生


或者如果你还不想更新,那么:

因为谷歌似乎不会在短期内对这个问题采取任何行动,我不得不为我所有的应用程序想出一个更可靠的可重用解决方案:

  1. 首先在应用程序 “ res/values/attrs.xml”的 attrs.xml 文件中添加定制的 文本视图属性:

    <resources>
    <declare-styleable name="CustomTextView">
    <attr name="drawableStartCompat" format="reference"/>
    <attr name="drawableEndCompat" format="reference"/>
    <attr name="drawableTopCompat" format="reference"/>
    <attr name="drawableBottomCompat" format="reference"/>
    </declare-styleable>
    </resources>
    
  2. Then create custom TextView class like this:

    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.drawable.Drawable;
    import android.os.Build;
    import android.support.v7.content.res.AppCompatResources;
    import android.support.v7.widget.AppCompatTextView;
    import android.util.AttributeSet;
    
    
    public class CustomTextView extends AppCompatTextView {
    public CustomTextView(Context context) {
    super(context);
    }
    public CustomTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initAttrs(context, attrs);
    }
    public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initAttrs(context, attrs);
    }
    
    
    void initAttrs(Context context, AttributeSet attrs) {
    if (attrs != null) {
    TypedArray attributeArray = context.obtainStyledAttributes(
    attrs,
    R.styleable.CustomTextView);
    
    
    Drawable drawableStart = null;
    Drawable drawableEnd = null;
    Drawable drawableBottom = null;
    Drawable drawableTop = null;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    drawableStart = attributeArray.getDrawable(R.styleable.CustomTextView_drawableStartCompat);
    drawableEnd = attributeArray.getDrawable(R.styleable.CustomTextView_drawableEndCompat);
    drawableBottom = attributeArray.getDrawable(R.styleable.CustomTextView_drawableBottomCompat);
    drawableTop = attributeArray.getDrawable(R.styleable.CustomTextView_drawableTopCompat);
    } else {
    final int drawableStartId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableStartCompat, -1);
    final int drawableEndId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableEndCompat, -1);
    final int drawableBottomId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableBottomCompat, -1);
    final int drawableTopId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableTopCompat, -1);
    
    
    if (drawableStartId != -1)
    drawableStart = AppCompatResources.getDrawable(context, drawableStartId);
    if (drawableEndId != -1)
    drawableEnd = AppCompatResources.getDrawable(context, drawableEndId);
    if (drawableBottomId != -1)
    drawableBottom = AppCompatResources.getDrawable(context, drawableBottomId);
    if (drawableTopId != -1)
    drawableTop = AppCompatResources.getDrawable(context, drawableTopId);
    }
    
    
    // to support rtl
    setCompoundDrawablesRelativeWithIntrinsicBounds(drawableStart, drawableTop, drawableEnd, drawableBottom);
    attributeArray.recycle();
    }
    }
    }
    
  3. Now you can use it easily in any layouts by your custom attributes:

    <YOUR_VIEW_PACKAGE.CustomTextView
    android:id="@+id/edt_my_edit_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:drawableStartCompat="@drawable/your_vector_drawable" <!-- vector drawable -->
    app:drawableEndCompat="@drawable/your_vector_drawable" <!-- vector drawable -->
    app:drawableTopCompat="@drawable/your_vector_drawable" <!-- vector drawable -->
    app:drawableBottomCompat="@drawable/your_vector_drawable" <!-- vector drawable -->
    />
    
    • 你可以用 按钮编辑文本无线电按钮做类似的事情,因为它们是从 TextView 派生出来的

希望这对你有帮助:)

如果您正在使用绑定,那么还有另一种神奇的方法可以在 TextView 中使用相同的方法。把它们包起来:

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

这将神奇地工作,我还没有调查什么正在发生幕后,但我猜测的 TextView 是使用 AppCompatResources或类似的 getDrawable方法。

我发现最好的办法是:

Drawable leftDrawable = AppCompatResources.getDrawable(this, R.drawable.ic_search);
search.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, null, null);

为了补充这里的一些答案: 你可以让 VectorDrawable 作为 drawableLeft(等等)工作,但这取决于支持库的版本,而且是有代价的。

它在哪些情况下有效?我使用 这张图来提供帮助(对于 Support Library 23.4.0至少有效-25.1.0)。

VectorDrawable cheatsheet

我这么晚才回答这个问题,因为这个问题我一直坚持到很晚。我在使用 TextView 时遇到了同样的问题: svg/矢量绘图。我可以用下面的两行代码来解决我的问题,而不是让你自己的自定义绘图:

Drawable drawableTop = AppCompatResources.getDrawable(view.getContext(), iconId);
view.setCompoundDrawablesWithIntrinsicBounds(null, drawableTop, null, null);

希望能帮到你。

其他的答案都不起作用,下面是我如何将一个 VectorDrawable加到一个 TextView中的,当处理下面的 Android L中的 VectorDrawables时,你应该使用 VectorDrawableCompat.create():

TextView titleTextView = (TextView) viewHolder.getView(android.R.id.text1);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
Drawable leftDrawable = AppCompatResources
.getDrawable(context, R.drawable.ic_tickbox);
titleTextView.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, null, null);
}
else
{
//Safely create our VectorDrawable on pre-L android versions.
Drawable leftDrawable = VectorDrawableCompat
.create(context.getResources(), R.drawable.ic_tickbox, null);
titleTextView.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, null, null);
}

简短,甜蜜,直奔主题!

我为此设计了一个很小的库 -Textview-rich-draable 文本视图-丰富-可绘制(它还支持定义复合绘图的大小和着色)。

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Some text"
app:compoundDrawableHeight="24dp"
app:compoundDrawableWidth="24dp"
app:drawableTopVector="@drawable/some_vector_drawble"
app:drawableEndVector="@drawable/another_vector_drawable"
app:drawableTint="@color/colorAccent" />

还有依赖性

compile 'com.tolstykh.textviewrichdrawable:textview-rich-drawable:0.3.2'

enter image description here

我浏览了所有的答案,并使用了最新的 Android 工作室3.0.1和 AppCompat 支持库26.1.0,我可以保证这个工作得很好。

建造,分级(应用程序)文件中

android {
compileSdkVersion 26
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}


dependencies {
implementation 'com.android.support:appcompat-v7:26.1.0'
}

并且在活动扩展 AppcompatActivity包括这外面 方法,即 static

static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

或者如果你想把这个应用程序应用到整个应用程序中,只需要在里面包含这一行 扩展 Application类的类

override fun onCreate() {
super.onCreate()
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
}

Xml 中的文本视图

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">


<TextView
android:id="@+id/passName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/account_drawableleft_selector"
android:drawablePadding="5dp"
android:ellipsize="marquee"
android:fontFamily="@font/montserrat_light_family"
android:gravity="center_vertical"
android:marqueeRepeatLimit="marquee_forever"
android:paddingRight="10dp"
android:scrollHorizontally="true"
android:singleLine="true"
android:textColor="@color/app_text_color"
android:textSize="12sp"
tools:text="Account Name" />
</LinearLayout>

Account _ drablelleft _ selector. xml

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

在 build.gradle (app)文件中

android {
compileSdkVersion 26
defaultConfig {
vectorDrawables.useSupportLibrary = true
}


dataBinding {
enabled = true
}
}

...

public class BindingUtils {
@BindingAdapter("android:drawableRight")
public static void setDrawableStart(TextView textView, int resourceId) {
Drawable drawable = AppCompatResources.getDrawable(textView.getContext(), resourceId);
Drawable[] drawables = textView.getCompoundDrawables();
textView.setCompoundDrawablesWithIntrinsicBounds(drawable,
drawables[1], drawables[2], drawables[3]);
}
}

使用(数据绑定时)

android:drawableRight="@{viewModel.ResId}"

或(正常)

android:drawableRight="@{@drawable/ic_login_24dp}"

基于 Behzad Bahmanyar 的 回答,我注意到我不能使用 android 的普通属性来处理普通的 png 文件:

android:drawableTop
android:drawableBottom
etc

因为它将被替换为 null in

Drawable drawableTop = null;
...
setCompoundDrawablesRelativeWithIntrinsicBounds(drawableStart, drawableTop, drawableEnd, drawableBottom);

如果 app:drawableTopCompat没有设置,但 android:drawableTop是(例如)。

以下是完整的解决方案:

public class CustomTextView extends AppCompatTextView {
private static final int NOT_SET = -1;
private static final int LEFT = 0;
private static final int START = 0;
private static final int TOP = 1;
private static final int RIGHT = 2;
private static final int END = 2;
private static final int BOTTOM = 3;


public CustomTextView(Context context) {
super(context);
}


public CustomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initAttrs(context, attrs);
}


public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initAttrs(context, attrs);
}


void initAttrs(Context context, AttributeSet attrs) {
if (attrs == null) {
return;
}
Drawable[] drawablesArr = getCompoundDrawables();


TypedArray attributeArray = context.obtainStyledAttributes(attrs, R.styleable.CustomTextView);
Drawable drawableStart = null;
Drawable drawableEnd = null;
Drawable drawableBottom = null;
Drawable drawableTop = null;
Drawable drawableLeft = null;
Drawable drawableRight = null;


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
drawableStart = attributeArray.getDrawable(R.styleable.CustomTextView_drawableStartCompat);
drawableEnd = attributeArray.getDrawable(R.styleable.CustomTextView_drawableEndCompat);
drawableBottom = attributeArray.getDrawable(R.styleable.CustomTextView_drawableBottomCompat);
drawableTop = attributeArray.getDrawable(R.styleable.CustomTextView_drawableTopCompat);
drawableLeft = attributeArray.getDrawable(R.styleable.CustomTextView_drawableLeftCompat);
drawableRight = attributeArray.getDrawable(R.styleable.CustomTextView_drawableRightCompat);
} else {
final int drawableStartId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableStartCompat, NOT_SET);
final int drawableEndId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableEndCompat, NOT_SET);
final int drawableBottomId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableBottomCompat, NOT_SET);
final int drawableTopId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableTopCompat, NOT_SET);
final int drawableLeftId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableLeftCompat, NOT_SET);
final int drawableRightId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableRightCompat, NOT_SET);


if (drawableStartId != NOT_SET)
drawableStart = AppCompatResources.getDrawable(context, drawableStartId);
if (drawableLeftId != NOT_SET)
drawableLeft = AppCompatResources.getDrawable(context, drawableLeftId);
if (drawableEndId != NOT_SET)
drawableEnd = AppCompatResources.getDrawable(context, drawableEndId);
if (drawableRightId != NOT_SET)
drawableRight = AppCompatResources.getDrawable(context, drawableRightId);
if (drawableBottomId != NOT_SET)
drawableBottom = AppCompatResources.getDrawable(context, drawableBottomId);
if (drawableTopId != NOT_SET)
drawableTop = AppCompatResources.getDrawable(context, drawableTopId);
}


drawableStart = (drawableStart != null ? drawableStart : drawablesArr[START]);
drawableLeft = (drawableLeft != null ? drawableLeft : drawablesArr[LEFT]);
drawableStart = (drawableStart != null ? drawableStart : drawableLeft);


drawableEnd = (drawableEnd != null ? drawableEnd : drawablesArr[END]);
drawableRight = (drawableRight != null ? drawableRight : drawablesArr[RIGHT]);
drawableEnd = (drawableEnd != null ? drawableEnd : drawableRight);


drawableBottom = (drawableBottom != null ? drawableBottom : drawablesArr[BOTTOM]);
drawableTop = (drawableTop != null ? drawableTop : drawablesArr[TOP]);


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
setCompoundDrawablesRelativeWithIntrinsicBounds(drawableStart, drawableTop, drawableEnd, drawableBottom);
} else {
setCompoundDrawables(drawableStart, drawableTop, drawableEnd, drawableBottom);
}


attributeArray.recycle();
}
}

使用矢量绘图器

Kotlin

 val drawable1 = VectorDrawableCompat.create(resources, R.drawable.ic_rb_username, theme)
yourView.setCompoundDrawablesRelativeWithIntrinsicBounds( drawable1, null, null, null)

爪哇咖啡

  Drawable drawable1 = VectorDrawableCompat.create(getResources(), R.drawable.ic_rb_username, getTheme());
yourView.setCompoundDrawablesRelativeWithIntrinsicBounds( drawable1, null, null, null);

Appcompat: appcompat: 1.1.0开始,您可以使用

app:drawableLeftCompat
app:drawableStartCompat
...

向下兼容:

TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(textView, left, top, right, bottom)

我使用绑定适配器来解决这个问题

@JvmStatic
@BindingAdapter("drawableSvgLeft")
fun addDrawableSvgLeft(textView: TextView,drawable: Drawable){
textView.setCompoundDrawablesWithIntrinsicBounds(drawable,null,null,null)
}


@JvmStatic
@BindingAdapter("drawableSvgRight")
fun addDrawableSvgRight(textView: TextView,drawable: Drawable){
textView.setCompoundDrawablesWithIntrinsicBounds(null,null,drawable,null)
}

也用这种方式在我的布局

<TextView
drawableSvgRight="@{@drawable/svg_ic_battle_trophy}"
.....

UseSupportLibrary = true 默认配置是必需的