最新更新-2019年6月
自原始答案以来,支持库已有所更改。现在,即使是Gradle的Android插件也能够在构建时自动生成PNG。因此,下面是目前应该使用的两种新方法。您可以在此处找到更多信息:
PNG生成
Gradle可以在构建时根据您的资产自动创建PNG图像。但是,在这种方法中,并非所有xml元素都受支持。此解决方案很方便,因为您无需更改代码或build.gradle中的任何内容。只要确保您使用的是Android Plugin 1.5.0或更高版本以及Android Studio 2.2或更高版本。
我在我的应用程序中使用了此解决方案,并且工作正常。无需其他build.gradle标志。无需黑客。如果转到/ build / generated / res / pngs / ...,则可以看到所有生成的PNG。
因此,如果您有一些简单的图标(因为并非所有xml元素都受支持),则此解决方案可能适用。只需更新您的Android Studio和适用于Gradle的Android插件即可。
支持库
也许这是将为您服务的解决方案。如果您来到这里,则意味着您的Android Studio不会自动生成PNG。因此,您的应用程序崩溃了。
或者,也许您根本不希望Android Studio生成任何PNG。
与支持XML元素子集的“自动PNG生成”不同,此解决方案支持所有xml标签。因此,您对矢量可绘制对象具有完全的支持。
您必须首先更新build.gradle以支持它:
android {
defaultConfig {
// This flag will also prevents Android Studio from generating PNGs automatically
vectorDrawables.useSupportLibrary = true
}
}
dependencies {
// Use this for Support Library
implementation 'com.android.support:appcompat-v7:23.2.0' // OR HIGHER
// Use this for AndroidX
implementation 'androidx.appcompat:appcompat:1.1.0' // OR HIGHER
}
然后,使用app:srcCompat
而不是android:src
在加载时VectorDrawables
。不要忘记这一点。
对于TextView
,如果您使用的androidx
是支持库版本,则可以使用app:drawableLeftCompat
(或右,上,下)代替app:drawableLeft
如果是CheckBox
/ RadioButton
,请使用app:buttonCompat
代替android:button
。
如果你不使用androidx
的支持库和你的版本minSdkVersion
就是17
以上或使用按钮,您可以尝试通过设置编程
Drawable icon = AppCompatResources.getDrawable(context, <drawable_id>);
textView.setCompoundDrawablesWithIntrinsicBounds(<leftIcon>,<topIcon>,<rightIcon>,<bottomIcon>);
更新-2016年7月
他们在Android支持库23.4.0中重新启用了
VectorDrawable
对于AppCompat用户,我们添加了一个选择加入 API,以通过AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)从资源重新启用对Vector Drawables的支持(行为在23.2中找到)-请记住,这仍然可能导致内存使用和更新配置实例时出现问题,因此默认情况下为何禁用它。
也许,build.gradle
设置已过时,您只需要在适当的活动中启用它即可(但是,需要测试)。
现在,要启用它,您必须执行以下操作:
public class MainActivity extends AppCompatActivity {
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
...
}
原始答案-2016年4月
我认为这是因为在最新的库版本23.3.0中禁用了Support Vector
根据这一POST:
对于AppCompat用户,由于在版本23.2.0 / 23.2.1 (ISSUE 205236)中的实现中发现的问题,我们决定删除允许您在棒棒糖设备上的资源中使用矢量绘制工具的功能。使用app:srcCompat和setImageResource()继续工作。
如果您访问问题ISSUE 205236,它们似乎将来会启用,但是内存问题不会很快得到解决:
在下一个版本中,我添加了一个可选API,您可以在其中重新启用已删除的VectorDrawable支持。它具有与以前相同的警告(内存使用情况和配置更新问题)。
我有一个类似的问题。因此,在我的情况下,我将所有使用vector drawable的图标从资源重新还原为PNG图像(因为即使提供了重新启用选项后,内存问题仍然会发生)。
我不确定这是否是最佳选择,但我认为它可以解决所有崩溃问题。