当前位置: 首页 > 知识库问答 >
问题:

在Lollipop崩溃前使用android vector Drawables

易琨
2023-03-14

我使用矢量绘图在Android之前Lollipop和这些是我的一些库和工具版本:

  • Android Studio: 2.0
  • AndroidGradle插件
  • 构建工具:23.0.2
  • Android支持库:23.3.0

我在我的应用级别Build中添加了此属性。Gradle

android {  
  defaultConfig {  
    vectorDrawables.useSupportLibrary = true  
   }  
}

还值得一提的是,我使用一个额外的绘图,如LayerDrawable(layer_list),如Android官方博客中所述(链接此处),用于为应用程序之外的矢量绘图设置绘图:srcCompat

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

你会发现直接引用应用程序之外的矢量绘图:srcCompat将在Lollipop之前失败。但是,当向量可绘制文件在另一个可绘制容器(如StateListDrawable、InsertDrawable、LayerDrawable、LevelListDrawable和RotatedRaawable)中引用时,AppCompat支持加载向量可绘制文件。通过使用这种间接方式,您可以在TextView的android:drawableLeft属性等情况下使用向量可绘制项,而该属性通常无法支持向量可绘制项。

当我使用app:srcCompat时,一切正常,但当我使用:

android:background
android:drawableLeft
android:drawableRight
android:drawableTop
android:drawableBottom

在Lollipop之前的ImageViewImageButtonTextViewEditText上,它抛出一个期望值:

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/search_toggle.xml from drawable resource ID #0x7f0200a9

共有3个答案

翟嘉年
2023-03-14

为了详细说明其他非常好的答案,这里有一个图表可以帮助您。如果您拥有23.4版本的支持库,则此选项有效。0到至少25.1。0

公子昂
2023-03-14

我也有同样的问题。但是做了很多R

对于Imageview和ImageButton使用,app:srcCompat=“@drawable/…” 和其他视图,如按钮、文本视图,而不是使用“drawableLeft/right…” 在XML中,以编程方式指定可绘图项,如下所示:

button.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(mContext,R.drawable.ic_share_brown_18dp), null, null, null);

并使用“AppCompatResources”获取可绘制的。

关浩壤
2023-03-14

最新更新-六月/2019

支持库与最初的答案相比发生了一些变化。现在,即使是Gradle的Android插件也能够在构建时自动生成PNG。因此,下面是目前应该有效的两种新方法。您可以在这里找到更多信息:

PNG生成

Gradle可以在构建时自动从您的资产创建PNG图像。然而,在这种方法中,并不是所有的xml元素都被支持。这个解决方案很方便,因为你不需要在你的代码或build.gradle.中改变任何东西。只要确保你使用的是Android插件1.5.0或更高版本和Android Studio2.2或更高版本。

我正在我的应用程序中使用此解决方案,效果很好。没有额外的构建。格雷德尔旗是必要的。没有黑客是必要的。如果您转到/build/generated/res/pngs/。。。您可以看到所有生成的PNG。

因此,如果您有一些简单的图标(因为并非所有的xml元素都受支持),这个解决方案可能适合您。只需为Gradle更新您的Android Studio和Android插件。

支持库

也许,这就是适合您的解决方案。如果你来到这里,这意味着你的Android Studio不会自动生成PNG。所以,你的应用程序正在崩溃。

或者,你根本不希望Android Studio生成任何巴布亚新几内亚。

与支持XML元素子集的“自动PNG生成”不同,此解决方案支持所有XML标记。所以,你完全支持你的矢量绘图。

您必须首先更新您的构建。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
}

然后,在加载VectorDrawables时,使用app:srcCompat而不是android:src。别忘了这一点。

对于TextView,如果您使用的是支持库的androidx版本,则可以使用app:drawableLeftCompat(或右、上、下)而不是app:drawableLeft

CheckBox/RadioButton的情况下,使用app: ButonCompat而不是android:按钮

如果您没有使用支持库的androidx版本,并且您的minSdkVersion17或更高版本,或者使用按钮,您可以尝试通过

Drawable icon = AppCompatResources.getDrawable(context, <drawable_id>);
textView.setCompoundDrawablesWithIntrinsicBounds(<leftIcon>,<topIcon>,<rightIcon>,<bottomIcon>);

更新-2016年7月

他们重新启用VectorDrawable在
Android支持库23.4.0

对于AppCompat用户,我们添加了一个选择加入的应用编程接口,通过AppCompatDelegate.setCompatVectorFromResourcesEnable(true)从资源中重新启用支持矢量绘图(23.2中的行为)-请记住,这仍然会导致内存使用问题和更新配置实例的问题,因此,默认情况下它是禁用的。

也许,build。gradle设置现在已过时,您只需在适当的活动中启用它(不过,需要进行测试)。

现在,要启用它,您必须执行以下操作:

public class MainActivity extends AppCompatActivity {
    static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

    ...
}

原文答复-Apr/2016

我认为这是因为在最新的库版本23.3中禁用了支持向量机。0

根据这篇文章:

对于AppCompat用户,由于在23.2版的实现中发现的问题,我们决定删除允许您在Lollipop制作前的设备上使用资源中的vector drawables的功能。0/23.2.1(第205236期)。使用app:srcCompat和setImageResource()继续工作。

如果您访问发行号205236,它们似乎将在将来启用,但内存问题不会很快得到解决:

在下一个版本中,我添加了一个选择加入的API,您可以在其中重新启用已删除的VectorDrawable支持。它附带了与以前相同的警告(内存使用和配置更新问题)。

我也有类似的问题。因此,在我的例子中,我再次将所有使用矢量从资源绘制到PNG图像的图标还原(因为内存问题将继续发生,即使它们提供了再次启用的选项)。

我不确定这是否是最好的选择,但在我看来,它修复了所有的崩溃。

 类似资料:
  • 我正在尝试学习适用于Android的OpenGL ES 1.0。我的应用程序运行良好,直到今天早上我将设备升级到Android 5.0.1,Lollipop。我最初尝试调试这个问题很快发现我的应用程序仍然可以在运行KitKat的模拟器上运行,但在我的设备和模拟器上的Lollipop上崩溃。 我的应用程序使用OpenGL绘制了一个简单的立方体,每边都有不同的纹理。我已经将它故障处理到它在glDraw

  • 自过去2个月以来,我们开始在开发人员控制台中接收到仅适用于部分三星设备的本机崩溃。 这是车祸痕迹 这是迄今为止收到崩溃的设备列表- 你知道为什么会这样吗? 这是构建。格拉德尔

  • 问题内容: 我正在尝试在我的角度应用程序中包括以下Bootstrap可折叠面板。但是,当我单击“展开”时,似乎可以看到角度,然后将其重定向到主页,而不是折叠面板。我的路由看起来像这样,我认为是引起问题的原因。有什么建议? 面板- 问题答案: 作为一个类似的问题mentionned,简单地由数据目标属性改变您的href

  • 我使用getStringArrayListExtra()搜索将列表从一个活动传输到另一个活动。这在第一次(从MainActivity到Diag2Activity)时运行良好,但在第二次(从Diag2Activity到SSToActivity)时应用程序崩溃。 每次我使用相同的方法:第一次活动: 第二项活动: 谁能告诉我错误可能来自哪里?提前谢谢 请在下面找到完整的代码: 主要活动。JAVA } 主

  • 我有目前的用户(在我的应用程序是医生): 如果我在viewmodel类中使用它,我的应用程序就会崩溃。也许医生是空的。我在授权页面中创建了一些医生(它是用户在后端创建的存根): 页面代码如下所示: 我在使用单例中做错了什么? UPD:这份坠机报告(它什么都没告诉我) 构建指纹:“小米/kenzo/kenzo:6.0.1/MMB29M/8.11.8:用户/释放密钥”修订版:“0”ABI:“arm64

  • 我最近在PlayStore上发布了一个应用程序,我的React原生“仅Android”版本出现了如下问题: 应用程序将在模拟器和实际android设备上以及在我的本地主机以外的其他IP上提供此错误,如my/etc/hosts中所述: 任何支持都是非常感谢的。 致以最诚挚的问候,