Zeichnende App für Android-Vektoren: srcCompat zeigt keine Bilder an

79

Ich benutze die Support-Bibliothek, um Vektorgrafiken auf Android Kitkat anzuzeigen. Wenn ich meine App auf Emulater teste, sehe ich keines dieser Bilder. Ich habe ein separates Layout für Android Lollipop und höher erstellt und es hat perfekt funktioniert (ich denke, weil ich srcAttribut anstelle von srcCompatHier ist der Code, in dem ich die Support-Bibliothek verwende) verwende

<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>

und es ist seltsam, weil ich die Bilder im Android Studio Vorschaufenster sehe.

David
quelle
5
Verwenden Sie android.support.v7.widget.AppCompatImageViewund stellen Sie sicher, dass Sie die neueste Support-Version verwenden.
Jared Burrows
1
@ Jared Burrows Danke! Könnten Sie dies wie eine Antwort schreiben? Ich würde es gerne akzeptieren!
David

Antworten:

197

Ursprüngliche Antwort

Verwenden Sie android.support.v7.widget.AppCompatImageViewstatt ImageViewin Ihrem Layout wie folgt:

<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>

Siehe die AppCompatImageViewDokumente hier und app:srcCompat hier .

Stellen Sie außerdem Folgendes sicher:

Richten Sie Ihre build.gradle

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

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

Erweitern Sie Ihre ActivitymitAppCompatActivity

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

    setContentView(R.layout.activity_main);
  }
}

Stellen Sie bei der Verwendung app:srcCompatsicher, dass Ihr Layout die richtigen Deklarationen enthält:

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

Optional (Warnung: Bitte lesen Sie die Dokumente): setCompatVectorFromResourcesEnabledin Ihrer ApplicationKlasse

public class App extends Application {

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

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

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

Jared Burrows
quelle
2
Warum funktioniert es nicht einfach mit ImageView in supportLibVersion = '25 .0.1 '?
toobsco42
1
@ toobsco42 Wenn man sich die aussehen ImageViewdocs, developer.android.com/reference/android/widget/ImageView.html , hat nicht srcCompataber AppCompatImageViewtut: developer.android.com/reference/android/support/v7/widget/... .
Jared Burrows
7
Warum sollte ich AppCompatImageViewim Layout verwenden. Das Dokument sagt: "Dies wird automatisch verwendet, wenn Sie ImageView in Ihren Layouts verwenden. Sie sollten diese Klasse nur manuell verwenden müssen, wenn Sie benutzerdefinierte Ansichten schreiben."
Ordon
1
Das ist die vollständigste Antwort aller Zeiten. Vielen Dank.
Leoneboaventura
4
@JaredBurrows #JustForRecords Es ist nicht erforderlich, die Aktivität von AppCompatActivity zu erweitern, wenn Sie das Attribut app: srcCompat für android.support.v7.widget.AppCompatImageView
Ewoks
17

Ich hatte ein ähnliches Problem und nachdem ich alle Schritte aus Jared Burrows 'Antwort befolgt hatte, war das Problem nicht gelöst.

Es stellt sich heraus, dass der "App" -Namensraum in meiner Layoutdatei wie folgt festgelegt wurde:

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

Anstatt von:

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

Nach dem Ändern wurde das Problem behoben

D-C0d3r
quelle
8

Wenn jemand anderes auf dieses Problem stößt und Androidx verwendet , versuchen Sie es mit androidx.appcompat.widget.AppCompatImageView

Nada
quelle
2
Warum sollte ich AppCompatImageView im Layout verwenden? Das Dokument sagt: "Dies wird automatisch verwendet, wenn Sie ImageView in Ihren Layouts verwenden. Sie sollten diese Klasse nur manuell verwenden müssen, wenn Sie benutzerdefinierte Ansichten schreiben."
S. Gissel
1
@ S.Gissel gut, ich denke du verwendest möglicherweise eine aktualisierte Version. Zu der Zeit, als ich dies versuchte, war dies die einzige Lösung, die für meinen Fall funktionierte
nada
2

In Summe:

  1. Fügen Sie in Ihr Modul eine Vektor-Zeichenunterstützung ein (build.gradle)

    defaultConfig {           
         vectorDrawables.useSupportLibrary = true
     }
    
  2. Anstelle von android:src="@drawable/icon"Gebrauchapp:srcCompat="@drawable/icon"

  3. Stellen Sie sicher , Ihr Activity extends AppCompatActivityohne diesen Schritt ist nicht möglich , Vektor - Bild zu zeigen , mitapp:srcCompat

Gabriel Perez
quelle
Dies war bei mir der Fall. Ich habe FragmentActivity erweitert. Vielen Dank, dass Sie diese Erklärung hinzugefügt haben!
Kulbir Saini
1

verwenden:

android:background="@drawable/circle_icon"

Anstatt von:

app:srcCompat="@drawable/circle_icon"
Gouda Elalfy
quelle
1
Ich kann Ihre Antwort berücksichtigen, da sie das Bild zeigt. Vielen Dank! Das Schlimme ist, dass wir kein Feedback erhalten können, wenn der Benutzer das Bild berührt.
Filipe Brito
1
In der Tat sollte es vermieden werden.
CoXier
1

Implementieren und app:srcCompactund dann können Sie es auf dem verwendenImageView

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

Stellen Sie sicher, dass Sie die richtige Version implementieren.

Dann in deinem build.gradleSetandroid.defaultConfig.vectorDrawables.useSupportLibrary = true

defaultConfig {

    //...

    vectorDrawables {
        useSupportLibrary true
    }
}
Isaac Sekamatte
quelle
1

Das Problem war auch mit meinem Code. Lösung: Da Android auf Androidx-Artefakte aktualisiert wird, habe ich anstelle von "Normal" verwendet und es hat funktioniert!

Abhishek
quelle
0

Stellen Sie außerdem sicher, dass sich Ihre Vektorzeichnungen in drawableund nicht in befinden drawable-anydpi.

Ich habe oft Probleme, wenn sich die Grafiken im drawable-anydpiOrdner befinden.

Fabi755
quelle