Ich habe meine App debuggt und gefunden, während ich auf eine ImageView
-Referenz schwebte, das ist AppCompatImageView
anstelle von ImageView
. Das gleiche passiert mit einem TextView
(mit AppCompatTextView
).
Obwohl ich mit diesem Verhalten aufgrund seiner AppCompat nicht sonderlich Probleme habe, aber wenn ich den Code anderer Entwickler untersuche, sah ich extends Activity
anstelle von AppCompatActivity
und habe es fast als "schlechte Praxis" markiert ".
Andererseits habe ich während der Arbeit an Vektorbildern ein ImageView
verwendet und es gab ein Problem, weil ich kein AppCompatImageView
verwendet hatte und es war die Lösung:
ImageView wird nicht korrekt auf dem Gerät angezeigt
Dieses inkonsistente Verhalten hat mich wirklich verwirrt, was die Praktiken betrifft, denen ich folgen sollte. Soll ich von jetzt an von einer Aktivität ausgehen?
Kurze Antwort auf "Sollte ich von jetzt an nur von einer Aktivität ausgehen?" Ist dies nicht der Fall, sollten Sie AppCompatActivity
verlängern, da es älteren Geräten abwärtskompatible Funktionen bietet. Im Fall von AppCompatImageView
:
Ein ImageView, das kompatible Funktionen auf älteren Versionen der Plattform unterstützt, einschließlich:
- Ermöglicht die dynamische Tönung des Hintergrunds über die Hintergrund-Tönungsmethoden in ViewCompat.
- Ermöglicht die Einstellung des Hintergrundtons mit backgroundTint und backgroundTintMode.
- Erlaubt die dynamische Abtönung seines Bildes über die Bildfarbmethoden in ImageViewCompat.
- Erlaubt die Einstellung des Bildfarbtons mit Tint und TintMode.
Außerdem wird die Kompatibilität mit Vektorzeichen für ältere Android-Versionen verbessert.
Erklärung zu den Inkonsistenzen
Wie in AppCompatImageView
erklärt:
Dies wird automatisch verwendet, wenn Sie ImageView in Ihren Layouts verwenden und die Aktivität / der Dialog auf oberster Ebene von appcompat bereitgestellt wird.
Also, es ist nicht unerwartet.
Wie es funktioniert
AppCompatActivity
installiert eine LayoutInflater.Factory2
, um die Inflation bestimmter Ansichten abzufangen. Der Code dieses Inflators kann in AppCompatViewInflater eingesehen werden .java .
Die Funktion, die für die Erstellung von Views
zuständig ist, ist AppCompatViewInflater#createView(View, String, Context, AttributeSet, boolean, boolean, boolean, boolean)
, und wie Sie hier sehen können, wird nach einfachen Ansichtsnamen gesucht (ohne dass das Paket vorangestellt wird) und stattdessen die AppCompat*
-Version erstellt:
Erzwingt die Verwendung von Nicht-AppCompat-Ansichten
Um die Erstellung einer regulären ImageView
(no AppCompatImageView
) zu erzwingen, während immer noch AppCompatActivity
verwendet wird, müssen Sie den vollständigen Klassennamen angeben, zum Beispiel:
Für weitere Informationen darüber, wie die Layout-Inflation funktioniert, können Sie das erstaunliche Gespräch " LayoutInflater: Friend sehen oder Feind? "von Chris Jenx , Autor von Kalligraphie .
Sollte ich jetzt von einer Aktivität ausgehen?
Nein. Der Unterschied zwischen einer normalen Komponente (Aktivität) oder einer Compat-Komponente (AppCompatActivity) besteht darin, dass Compat-Komponenten die neuesten UI-Komponenten in älteren Geräten unterstützen. Das ist die Abwärtskompatibilität , die Sie benötigen, wenn Sie eine große Anzahl von Geräten unterstützen.
Ich habe zwar kein besonderes Problem mit diesem Verhalten, da sein AppCompat immerhin
ist
Ja, Sie haben Recht, wenn Sie eine Bildansicht aus einer AppCompatActivity heraus verwenden, wird eine normale Bildansicht als AppCompatImageView konvertiert.
Folgen Sie diesem Link, um mehr über AppCompatImageView zu lesen.
AppCompatImageView funktioniert genauso wie ImageView. Die Support-Bibliothek AppCompat dient nur der Abwärtskompatibilität. Wenn Sie möchten, dass Ihre App abwärtskompatibel ist, sollten Sie die AppCompat-Klasse erweitern.