首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在按钮中可以使用VectorDrawable,TextViews可以使用android: possible,对吗?

在按钮中可以使用VectorDrawable,TextViews可以使用android: possible,对吗?
EN

Stack Overflow用户
提问于 2016-03-03 01:48:45
回答 17查看 72.6K关注 0票数 130

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

该应用程序可以在没有任何警告的情况下编译。

我在用

  • 1.5级
  • Support Library 23.2 ('com.android.support:appcompat-v7:23.2.0')

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

代码语言:javascript
复制
TextView tv = (TextView) findViewById(R.id.textView);
tv.setCompoundDrawablesWithIntrinsicBounds(null,null, getResources().getDrawable(R.drawable.ic_accessible_white_36px),null);

(我怀疑这是23.2的支持库错误。)

但是,是否可以将drawableRight等用于SVG资产?

这是我的布局

代码语言:javascript
复制
<?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>

这是我的活动

代码语言:javascript
复制
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);

        }
    }

这是来自谷歌材料设计网站的未经修改的VectorDrawable资产。

代码语言:javascript
复制
<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>

这是我的应用build.gradle

代码语言:javascript
复制
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'
}

这是撞车事故。(注意引用文本视图的膨胀错误。)

代码语言:javascript
复制
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) 
...
EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2016-10-25 22:25:44

是否可以将drawableRight等用于SVG资产?

AppCompatTextView 现在支持app:drawableLeftCompatapp:drawableTopCompatapp:drawableRightCompatapp:drawableBottomCompatapp:drawableStartCompatapp:drawableEndCompat复合绘图,支持可支持的绘图类型(如VectorDrawableCompat )。

将此包含在您的gradle文件中

代码语言:javascript
复制
implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'

在文本视图中,可以使用

代码语言:javascript
复制
app:drawableLeftCompat
app:drawableStartCompat

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

androidx.appcompat:appcompat:1.2.0-alpha01

他们有个窃听器

androidx.appcompat:appcompat:1.1.0-alpha01

你可以看到文档

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

因为谷歌似乎很快就不会对这个问题采取任何行动,所以我不得不为我的所有应用程序提供一个更可靠的可重用解决方案:

  1. 首先,在应用程序“res/TextView/atts.xml”的attrs.xml文件中添加自定义TextView属性:
  2. 然后创建如下所示的自定义TextView类: 导入(android.content.Context);导入(android.content.res.TypedArray);导入(android.graphics.drawable.Drawable);导入(android.os.Build);导入(android.support.v7.widget.AppCompatTextView);导入(android.util.AttributeSet);公共类( CustomTextView )扩展AppCompatTextView {公共(上下文)(上下文){超级(上下文);}公共CustomTextView(上下文,AttributeSet )(上下文,输出)(超级(上下文));} public CustomTextView( context,AttributeSet attrs,int defStyleAttr) { super(context,attrs,defStyleAttr);initAttrs(context,attrs);} void ( context,AttributeSet attrs) { if (attrs != null) { TypedArray attributeArray = context.obtainStyledAttributes( attrs,R.styleable.CustomTextView);可绘制的attributeArray.getDrawable(R.styleable.CustomTextView_drawableStartCompat);=空;可绘制的drawableBottom =空;可绘制的drawableTop =空;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { drawableStart = attributeArray.getDrawable(R.styleable.CustomTextView_drawableBottomCompat);drawableEnd =attributeArray.getDrawable(R.styleable.CustomTextView_drawableBottomCompat);最后的int -1;最终的int -1;最后的int -1;最后的int-1;最终int drawableTopId =drawableTopId -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);} //支持rtl drawableBottom drawableTop,drawableEnd,drawableBottom;attributeArray.recycle();}}
  3. 现在,您可以通过自定义属性轻松地在任何布局中使用它: @+id/edt_my_edit_text“android:layout_width="wrap_content”android:layout_height="wrap_content“app:drawableEndCompat="@drawable/your_vector_drawable”app:drawableTopCompat="@drawable/your_vector_drawable“app:drawableBottomCompat="@drawable/your_vector_drawable”/>“
代码语言:javascript
复制
- You can do similar thing with **Button**, **EditText** and **RadioButton** because they derived from TextView

希望这会有所帮助:)

票数 206
EN

Stack Overflow用户

发布于 2016-11-22 13:55:44

我发现最好的方法是:

代码语言:javascript
复制
Drawable leftDrawable = AppCompatResources.getDrawable(this, R.drawable.ic_search);
search.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, null, null);
票数 82
EN

Stack Overflow用户

发布于 2016-03-03 02:02:59

此解决方案不再正确。从23.3.0版本开始,矢量绘图只能通过app:srcCompat或setImageResource()加载。

尝试将可绘制的向量封装到图层列表或选择器中:

代码语言:javascript
复制
<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_accessible_white_wrapped.xml:

代码语言:javascript
复制
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_accessible_white_36px"/>
</layer-list>
票数 78
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35761636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档