Додаток для векторного малювання на Android: srcCompat не відображає зображення


80

Я використовую бібліотеку підтримки для показу векторних зображень на android kitkat. Коли я тестую свій додаток на емуляторі, я не бачу жодного з цих зображень. Я зробив окремий макет для андроїда льодяник і вище, і він працював ідеально (я думаю, тому що я використовую srcатрибут замість srcCompatОсь код, де я використовую бібліотеку підтримки

<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та переконайтесь, що використовуєте останню версію підтримки.
Джаред Берроуз,

1
@Jared Burrows Дякую! Не могли б ви написати це як відповідь? Я хотів би це прийняти!
Девід

Відповіді:


198

Оригінальна відповідь

Використовуйте 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

Розширте свій за ActivityдопомогоюAppCompatActivity

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
Чому це просто не працює з ImageView в supportLibVersion = '25 .0.1 '?
toobsco42

1
@ toobsco42 Якщо ви подивитесь на ImageViewдокументи, developer.android.com/reference/android/widget/ImageView.html , не має, srcCompatале AppCompatImageViewмає: developer.android.com/reference/android/support/v7/widget/… .
Джаред Берроус,

7
Чому я повинен використовувати AppCompatImageViewв макеті. У документі сказано: "Це буде автоматично використано, коли ви використовуєте ImageView у своїх макетах. Вам слід лише вручну використовувати цей клас під час написання власних подань."
Ордон

1
Це найповніша відповідь за всі часи. Дуже дякую.
leoneboaventura

4
@JaredBurrows #JustForRecords не потрібно розширювати активність з AppCompatActivity, якщо ви використовуєте атрибут app: srcCompat на android.support.v7.widget.AppCompatImageView
Ewoks

17

У мене була подібна проблема, і після всіх кроків із відповіді Джареда Берроуза проблема не була вирішена.

Виявляється, що простір імен "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 добре, я думаю, ви, можливо, використовуєте оновлену версію. На той час, коли я спробував це, це було єдине рішення, яке спрацювало для моєї справи
нада

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
Я можу розглянути вашу відповідь, тому що на ній показано зображення, тож спасибі! Погано те, що ми не можемо отримати відгук, коли користувач торкається зображення.
Філіпе Бріто

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 Artefacts, я використовував замість Regular і це спрацювало!


0

Додатково переконайтеся, що ваші векторні малюнки знаходяться в, drawableа не в drawable-anydpi.

У мене часто виникають проблеми, якщо графіка знаходиться в drawable-anydpiпапці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.