Ich habe also die neuesten Support-Bibliotheken aktualisiert und einen Absturz bekommen, den ich nicht beheben kann. Meine build.gradle hat jetzt diese Abhängigkeiten:
%Vor%Ich hatte einen funktionierenden Listener, der verwendet wird, um Klicks zu fangen und eine neue Aktivität zu starten. Dies funktionierte in Support-Bibliotheken v. 23.1.0, aber nicht in 23.4.0 (und 23.3.0):
%Vor% Dieser Listener wird einfach an ein ImageButton
angehängt und danach wird die Farbe des Buttons wie folgt getönt:
wo Tinting.tint()
meine eigene Tönungsfunktion ist:
Früher, als ich auf die Schaltfläche geklickt habe, hat alles wie erwartet funktioniert, aber jetzt scheint sich der Kontext der Ansicht in TintContextWrapper
geändert zu haben, zu dem ich wenig Information finden kann. Ich habe dieses Problem gefunden, aber das Projektmitglied empfiehlt, hier auf StackOverflow nachzufragen, also hier es ist.
Da das Projektmitglied im Google-Problem angegeben hat Sie müssen die Aktivität aus dem umschlossenen Kontext beziehen. Ich habe versucht, TintContextWrapper
anstatt MyActivity
zu verwenden, was gut funktioniert, aber ich kann nicht herausfinden, wie man MyActivity
von TintContextWrapper
bekommt.
MyActivity
von TintContextWrapper
? ImageButton
plötzlich in ein TintContextWrapper
eingepackt. beide Aktivität n TintContextWRapper kommt von ContextWrapper
. ContextWrapper
haben eine Methode getBaseContext()
. Es sollte einfach sein, eine Loop-Methode zu erstellen, die instanceof WrapContext
überprüft, den Basiskontext abruft und dann instanceof Activity
überprüft. (Wenn Sie Probleme mit dieser Methode haben, kommentieren Sie hier, dass ich mir ein Projekt von mir graben und hier zu Ihnen einfügen werde)
Weil AppCompat Ihren Kontext umschließt, um "compat" -Ansichten und "compat" -Farbtöne und andere "compat" -Stücke einfügen zu können. Das ist normal.
Ja. So macht AppCompat seine Sache.
@ Krøllebølle
Android-Unterstützungsbibliothek 23.4.0: android.support.v7.widget.TintContextWrapper kann nicht in umgewandelt werden Aktivität
Antwort auf Ihre Frage ist: Zuerst sollte Ihr Klick-Ereigniscode wie folgt aussehen:
%Vor%und schreibe dann die Funktion getRequiredActivity ():
%Vor%}
und Ihr Crash / Exception ist behoben:)
Mein Vorschlag besteht darin, eine Referenz Ihrer Aktivität an den onClickListener zu übergeben, um das Problem mit TintContextWrapper
zu vermeiden. Es ist einfach, der Klasse einen Verweis auf MyActivity
zu geben und mögliche Casting-Probleme zu vermeiden.
- Wie kann ich MyActivity vom TintContextWrapper erhalten?
Das solltest du wirklich nicht. Es ist nicht garantiert, dass der Kontext eines Views eine Aktivität ist - definitiv keine spezifische Aktivität. Wo setzen Sie Ihren OnClickListener? Ich gehe davon aus, dass Sie an der Stelle, an der Sie den Listener einstellen, Zugriff auf die Aktivität haben. Wenn Sie beispielsweise den Listener auf eine Aktivität einstellen:
%Vor%Tags und Links android android-support-library