Warum wählt Android AppCompat-Komponenten aus, wenn ich sie nicht explizit deklariere?

8

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?

    
pulp_fiction 16.08.2017, 10:20
quelle

3 Antworten

5

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:

%Vor%

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:

%Vor%

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 .

    
Xavier Rubio Jansana 29.08.2017 14:18
quelle
1
  

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.

AppCompatImageView

Folgen Sie diesem Link, um mehr über AppCompatImageView zu lesen.

    
Sree Vishnu 29.08.2017 13:53
quelle
-1

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.

    
Joshua Uchenna Amaju 16.08.2017 10:31
quelle

Tags und Links