Android 除了带SRCCPAT的ImageView外,如何将矢量绘图与View一起使用?
Android 除了带SRCCPAT的ImageView外,如何将矢量绘图与View一起使用?,android,android-support-library,android-vectordrawable,Android,Android Support Library,Android Vectordrawable,app:srcCompat和ImageView允许向后兼容使用矢量绘图。但是除了ImageView之外,如何将它们与其他视图一起使用呢?例如,TextView属性,如android:drawableLeft static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor); } 将vector drawable用作android:icon和MenuItem也会导致崩溃,但以下情况除外: Fatal Exc
app:srcCompat
和ImageView
允许向后兼容使用矢量绘图。但是除了ImageView
之外,如何将它们与其他视图
一起使用呢?例如,TextView
属性,如android:drawableLeft
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
将vector drawable用作android:icon
和MenuItem
也会导致崩溃,但以下情况除外:
Fatal Exception: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInflater.java:626)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
at android.view.LayoutInflater.inflate(LayoutInflater.java:470)
at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
at android.support.v7.view.menu.MenuItemImpl.setActionView(MenuItemImpl.java:621)
at android.support.v7.view.menu.MenuItemImpl.setActionView(MenuItemImpl.java:40)
at android.support.v4.view.MenuItemCompat.setActionView(MenuItemCompat.java:310)
at android.support.v7.view.SupportMenuInflater$MenuState.setItem(SupportMenuInflater.java:465)
at android.support.v7.view.SupportMenuInflater$MenuState.addItem(SupportMenuInflater.java:479)
at android.support.v7.view.SupportMenuInflater.parseMenu(SupportMenuInflater.java:196)
at android.support.v7.view.SupportMenuInflater.inflate(SupportMenuInflater.java:118)
at com.example.niceapp.context.main.MainActivity.onCreateOptionsMenu(MainActivity.java:101)
at android.app.Activity.onCreatePanelMenu(Activity.java:2578)
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
致命异常:android.view.InflateException:二进制XML文件行#2:膨胀类时出错
位于android.view.LayoutInflater.createView(LayoutInflater.java:626)
位于android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
在android.view.LayoutInflater.充气(LayoutInflater.java:470)
在android.view.LayoutInflater.inflate(LayoutInflater.java:398)
在android.support.v7.view.menu.menuitemmpl.setActionView(menuitemmpl.java:621)中
在android.support.v7.view.menu.menuitempl.setActionView(menuitempl.java:40)中
位于android.support.v4.view.MenuItemCompat.setActionView(MenuItemCompat.java:310)
位于android.support.v7.view.SupportMenuInflater$MenuState.setItem(SupportMenuInflater.java:465)
位于android.support.v7.view.SupportMenuInflater$MenuState.addItem(SupportMenuInflater.java:479)
在android.support.v7.view.SupportMenuInflater.parseMenu(SupportMenuInflater.java:196)中
在android.support.v7.view.SupportMenuInflater.inflate(SupportMenuInflater.java:118)中
位于com.example.niceapp.context.main.MainActivity.onCreateOptions菜单(MainActivity.java:101)
位于android.app.Activity.onCreatePanelMenu(Activity.java:2578)
使用支持库23.2.0,如何解决此问题?更新2:他们在支持库23.4.0中添加了一个选项以再次启用它:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
对于AppCompat用户,我们添加了一个opt-in API,通过重新启用资源中的支持向量可提取项(23.2中的行为)-请记住,这仍然会导致内存使用问题和更新配置实例问题,因此默认情况下禁用它
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
更新:
从23.3.0版开始,此功能不再有效
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
对于AppCompat用户,我们决定删除
允许您在棒棒糖制作前的设备上使用资源中的矢量绘图
由于版本23.2.0/23.2.1中的实施中发现的问题
[,。使用app:srcCompat
setImageResource()继续工作
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
从
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
使用AppCompat和app:srcCompat是将矢量绘图集成到应用程序中最简单的方法
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
这段引文来自官方发布的23.2.0版支持库
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
这篇文章还提到了以下几点:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
你会发现直接引用app之外的向量可绘制文件:srcCompat
在棒棒糖之前会失败。但是,AppCompat
确实支持在另一个可绘制容器中引用向量可绘制文件时加载向量可绘制文件,例如StateListDrawable
,insettDrawable
,layerdDrawable
,RotatedDrawable
。通过使用此间接方式,您可以在诸如TextView
的android:drawableLeft
属性之类的情况下使用向量drawables,这些属性通常无法支持向量drawables
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
这转化为以下步骤:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
第1步:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
创建或导入应用程序所需的矢量资源。例如,可以为搜索图标创建一个可绘制的矢量,并将其命名为ic\u action\u search\u vector.xml
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
第二步:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
为先前创建的向量可绘制创建另一个代理可绘制资源。例如,对于先前的ic\u action\u search\u vector.xml
,ic\u action\u search.xml
可以创建为一个简单的StateListDrawable
,其中可以包含以下行:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_action_search_vector"/>
</selector>
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
这就是该问题的解决方案!对于AppCompat 23.3.0版,没有通过选择器XML(razzledazzle接受的答案)的工作解决方案,我们可以通过编程方式实现这一点:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
activity_main.xml
<android.support.v7.widget.AppCompatImageButton
android:id="@+id/btnEnter"
/>
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
此代码与此选择器xml等效:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:state_pressed="false" android:drawable="@drawable/vc_accept" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/vc_accept_white" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/vc_accept_white" />
<item android:drawable="@drawable/vc_accept" />
</selector>
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
Android 5.0(API级别21)及更高版本提供矢量绘图支持。如果您的应用程序的最低API级别较低,则vector Asset Studio会将矢量绘图文件添加到您的项目中;此外,在构建时,Gradle会以各种分辨率创建PNG光栅图像。Gradle会生成特定于域的语言指定的PNG密度(DSL)build.gradle文件中的generatedDensities属性。要生成PNG,构建系统需要gradle 1.5.0或更高版本的Android插件
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
如果你把它包括在你的梯度中,这是不正确的
vectorDrawables.useSupportLibrary=true
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
设置为false或完全删除该行,所有向量都将正常工作。但对于旧版本的android,它们将能够依赖转换后的PNG。您可以通过编程方式在TextView中添加向量Drawable。使用VectorDrawableCompat以添加drawableLeft/drawableRight/drawableTop/drawableBottom/drawableStart/drawableEnd
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
步骤:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
i、 如果TextView位于活动内:
TextView tvUserName= (TextView)findViewById(R.id.et_username_or_email);
VectorDrawableCompat drawableCompat=VectorDrawableCompat.create(getResources(), R.drawable.layer_list_ic_user, tvUserName.getContext().getTheme());
tvUserName.setCompoundDrawablesRelativeWithIntrinsicBounds(drawableCompat, null, null, null);
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
ii.如果TextView位于片段内部:
TextView tvUserName= (TextView )view.findViewById(R.id.et_username_or_email);
VectorDrawableCompat drawableCompat=VectorDrawableCompat.create(getActivity().getResources(), R.drawable.layer_list_ic_user, tvUserName.getContext().getTheme());
tvUserName.setCompoundDrawablesRelativeWithIntrinsicBounds(drawableCompat, null, null, null);
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
有关VectorDrawableCompat的更多信息,请参阅此VectorDrawables可用于棒棒糖前的其他地方,而不是
app:srccomat
,但它是有价格的。
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
我提供了帮助(对支持库23.4.0至-至少-25.1.0有效)
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
我正在使用新的支持库,我所要做的就是:
compile 'com.android.support:appcompat-v7:25.1.1'
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
在Build.gradle文件中
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
现在,无论您在哪里使用片段、活动或适配器,都可以将其作为类中的第一行
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
然后像我们以前一样使用something.xml
<ImageView
android:id="@+id/ivMainNavigationIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}
或者如果你有可提取的身份证需要