【问题标题】:How to set VectorDrawable as an image for ImageView programmatically如何以编程方式将 VectorDrawable 设置为 ImageView 的图像
【发布时间】:2017-04-27 03:38:04
【问题描述】:

我想在 Android Studio 中将一些 vectorDrawables 设置为 ImageView

我可以轻松设置 png 和 jpg drawable,但是当我想设置 VectorDrawable 时,它​​不适用于 imageview。

img.setImageResource(R.drawable.ic_home);

ic_home 是 VectorDrawable,此代码不起作用。

【问题讨论】:

标签: android imageview android-vectordrawable


【解决方案1】:

根据官方android developer blog,vectorDrawables 在运行时的 setImageResource() 方法没有变化。

如果您在运行时更改可绘制对象,您将能够使用 相同的 setImageResource() 方法和以前一样 - 那里没有变化。使用 AppCompat 和 app:srcCompat 是将矢量绘图集成到您的最简单的方法 应用程序。

有关更多详细信息,请查看 Google Developer 撰写的这篇精彩文章 AppCompat — Age of the vectors

【讨论】:

    【解决方案2】:

    如果您担心向后兼容性,那么您应该使用AppCompatImageView 而不是图像视图。浏览下面的代码。

    <android.support.v7.widget.AppCompatImageView
        android:id="@+id/iv_about"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
       app:srcCompat="@drawable/ic_vector_image"
        />
    

    java

    AppCompatImageView image = (AppCompatImageView) findViewById(R.id.iv_about);
    image.setImageResource(R.drawable.ic_vector_image);
    

    下面的代码需要在build.gradle中添加

    android { defaultConfig{ vectorDrawables.useSupportLibrary = true } }

    它将服务于 app:srcCompat 的视角。

    【讨论】:

    • 不需要,根据文档“这将在您在布局中使用 ImageView 时自动使用,并且顶级活动/对话框由 appcompat 提供。您应该只需要手动使用编写自定义视图时的此类。”所以除非你扩展它,否则你可以只使用 ImageView。
    • @user924 我没有指定只要Activity扩展了AppCompatActivity就可以使用ImageView。如果你没有,就像你说的那样。
    【解决方案3】:

    如果您想使用矢量可绘制对象(小于或大于 API 21),只需执行以下操作:

    以编程方式设置图像(例如在您的活动中):

    imageView.setImageResource(R.drawable.ic_left_arrow_blue); 
    

    或通过 XML:

    app:srcCompat="@drawable/your_vector_name"
    

    在您应用的build.gradle 中,您需要包含:

    android {
        defaultConfig {
            vectorDrawables.useSupportLibrary = true
        }
    }
    

    对于低于 API 21 的矢量支持,将以下内容添加到 onCreate

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);  
    

    【讨论】:

    • 仍然不适用于 KitKat,仅适用于 >= 5.1 它适用于 setImageResource
    • 对于 KitKat 这仅适用于 stackoverflow.com/a/35918375/7767664
    • AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);解决了我在 Kitkat 上的问题
    【解决方案4】:

    我在回收站视图中有一个矢量,我正在使用img.setImageResource(R.drawable.ic_home),它无法正常工作,就像在回收站视图的某些项目中形成的其他图像一样。然后我用了img.setImageDrawable(activity.getResources().getDrawable(R.drawable.ic_home)) 这个工作。

    【讨论】:

      【解决方案5】:

      使用这个:

      android.support.v7.widget.AppCompatImageButton, 
      android.support.v7.widget.AppCompatImageView,
      android.support.v7.widget.AppCompatTextView 
      

      而不是ImageButtonImageView 等。

      如果使用矢量类型的图像。主要用于自定义视图。

      【讨论】:

        【解决方案6】:

        对于那些想要以编程方式加载矢量可绘制对象以用于其他用途的人,例如设置 drawableLeft 或其他方式,您可以使用:

        Drawable drawable = AppCompatResources.getDrawable(context, drawableRes);
        

        上下文是 AppCompatActivity。

        【讨论】:

        • 谢谢,我以前没见过这个 AppCompatResources 的东西。每个 SDK 版本都会使情况变得更糟。
        【解决方案7】:

        Java 代码使用:

        formate_img.setImageResource(R.drawable.ic_text);//ic_text is a Vector Image
        

        对于 XML 使用:

        <android.support.v7.widget.AppCompatImageView
                android:id="@+id/search_btn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:layout_weight="1"
                ads:srcCompat="@drawable/ic_barcode" //for Vector Image
                tools:ignore="VectorDrawableCompat" />
        

        【讨论】:

          【解决方案8】:

          从你的drawable文件夹中删除两个文件夹,然后重建你的项目,它将正常工作

          【讨论】:

            猜你喜欢
            • 2017-10-13
            • 2021-05-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多