Android矢量可绘制应用程序:srcCompat不显示图像


78

我正在使用支持库在android kitkat上显示矢量图像。当我在模拟器上测试我的应用程序时,我看不到任何这些图像。我为Android Lollipop及更高版本制作了单独的布局,并且运行良好(我认为是因为我使用的是src属性,而不是srcCompat下面的代码,这是我在USIG支持库中使用的代码

<LinearLayout android:layout_alignParentBottom="true"
android:id="@+id/lake_detail"
android:background="@drawable/my_fishing_plan_footer_line"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="90dp"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<RelativeLayout
            android:layout_marginRight="3dp"
            android:id="@+id/fire_logo"
            android:layout_width="20sp"
            android:layout_height="20sp">

            <ImageView
                android:tint="#d74313"
                app:srcCompat="@drawable/circle_icon"
                android:layout_width="30sp"
                android:layout_height="30sp" />

            <ImageView
                android:layout_centerVertical="true"
                android:layout_centerHorizontal="true"
                app:srcCompat="@drawable/lauzaviete"
                android:layout_width="25dp"
                android:layout_height="25dp" />

        </RelativeLayout>

这很奇怪,因为我在android studio预览窗口中看到了图像。


5
使用android.support.v7.widget.AppCompatImageView并确保您使用的是最新的支持版本。
Jared Burrows

1
@Jared Burrows谢谢!您能像答案一样写吗?我愿意接受!
大卫

Answers:


196

原始答案

使用android.support.v7.widget.AppCompatImageView而不是ImageView在您的布局中,如下所示:

<LinearLayout 
  ...
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">

  <android.support.v7.widget.AppCompatImageView
    android:tint="#d74313"
    app:srcCompat="@drawable/circle_icon"
    android:layout_width="30sp"
    android:layout_height="30sp" />

  <android.support.v7.widget.AppCompatImageView
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"
    app:srcCompat="@drawable/lauzaviete"
    android:layout_width="25dp"
    android:layout_height="25dp" />
</LinearLayout>

此处此处查看AppCompatImageView文档app:srcCompat

另外,请确保执行以下操作:

设置您的 build.gradle

android {
  defaultConfig {
    vectorDrawables {
      useSupportLibrary = true
    }
  }
}

文件:https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.VectorDrawablesOptions.html#com.android.build.gradle.internal.dsl.VectorDrawablesOptions: useSupportLibrary

扩展您ActivityAppCompatActivity

public final class MainActivity extends AppCompatActivity {    
  @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
  }
}

使用时app:srcCompat,请确保布局中具有正确的声明:

<LinearLayout 
  ...
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">
  ...
</LinearLayout>

可选(警告:请阅读文档):setCompatVectorFromResourcesEnabled在您的Application课程中

public class App extends Application {

  @Override public void onCreate() {
    super.onCreate();

    // Make sure we use vector drawables
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
  }
}

文件: https //developer.android.com/reference/android/support/v7/app/AppCompatDelegate.html#setCompatVectorFromResourcesEnabled(boolean)


2
为什么它不只与supportLibVersion = '25 .0.1'中的ImageView一起使用?
toobsco42 '16

1
@ toobsco42如果您查看ImageView文档,developer.android.com / reference / android / widget / ImageView.html尚不存在,srcCompatAppCompatImageView有:developer.android.com/reference/android/support/v7/widget/…
贾里德·伯罗斯

7
为什么要AppCompatImageView在布局中使用。该文档说:“当您在布局中使用ImageView时,它将自动使用。编写自定义视图时,您只需要手动使用此类即可。”
Ordon

1
这是有史以来最完整的答案。非常感谢。
leoneboaventura

4
@JaredBurrows #JustForRecords,如果您在android.support.v7.widget.AppCompatImageView上使用app:srcCompat属性,则无需扩展AppCompatActivity的活动
Ewoks

17

在遵循Jared Burrows的回答的所有步骤之后,我遇到了类似的问题了,问题仍未解决。

原来,我的布局文件中的“ app”命名空间设置为:

xmlns:app="http://schemas.android.com/tools"

代替:

xmlns:app="http://schemas.android.com/apk/res-auto"

更改此问题后,问题已解决


8

如果其他任何人遇到此问题并正在使用androidx,请尝试使用androidx.appcompat.widget.AppCompatImageView


2
为什么要在布局中使用AppCompatImageView。该文档说:“当您在布局中使用ImageView时,它将自动使用。编写自定义视图时,您只需要手动使用此类即可。”
S. Gissel

1
@ S.Gissel好,我想您可能正在使用更新版本。当时我尝试了这种方法,这是唯一适用于我的情况的解决方案
-Nada

2

综上所述:

  1. 将矢量可绘制支持放入模块(build.gradle)

    defaultConfig {           
         vectorDrawables.useSupportLibrary = true
     }
    
  2. 代替android:src="@drawable/icon"使用app:srcCompat="@drawable/icon"

  3. 确保Activity extends AppCompatActivity没有此步骤的您无法显示带有app:srcCompat


我就是这种情况。我正在扩展FragmentActivity。感谢您添加该说明!
Kulbir Saini

1

使用:

android:background="@drawable/circle_icon"

代替:

app:srcCompat="@drawable/circle_icon"

1
我可以考虑您的答案,因为它显示了图像,非常感谢!不利的是,当用户触摸图像时我们无法获得反馈。
Filipe Brito

1
实际上应该避免。
CoXier

1

实施,app:srcCompact然后您可以在ImageView

implementation 'com.android.support:appcompat-v7:28.0.0'

确保实现正确的版本。

然后在你的build.gradle集合android.defaultConfig.vectorDrawables.useSupportLibrary = true

defaultConfig {

    //...

    vectorDrawables {
        useSupportLibrary true
    }
}

1

问题也出在我的代码上。解决方案:随着Android升级到Androidx Artifacts,我使用了代替Regular的方法来工作!


0

另外,请确保矢量可绘制对象位于drawable而不位于中drawable-anydpi

如果图形位于drawable-anydpi文件夹中,我经常会遇到问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.