Android-Unterstützungsbibliothek 23.4.0: android.support.v7.widget.TintContextWrapper kann nicht in Activity umgewandelt werden

8

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:

%Vor%

wo Tinting.tint() meine eigene Tönungsfunktion ist:

%Vor%

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.

Was habe ich versucht?

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.

Also meine Fragen sind:

  1. Wie kann ich MyActivity von TintContextWrapper ?
  2. bekommen?
  3. Warum ist mein ImageButton plötzlich in ein TintContextWrapper eingepackt.
  4. Sollte dieses Verhalten wirklich erwartet werden?

Definition von ImageButton in XML ist einfach:

%Vor%

Stapelverfolgung:

%Vor%     
Krøllebølle 12.05.2016, 19:54
quelle

7 Antworten

8
  1. 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)

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

  3. Ja. So macht AppCompat seine Sache.

Budius 12.05.2016, 20:06
quelle
4

@ 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:)

    
Nitesh Jha 08.11.2016 07:19
quelle
3

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.

    
Fire3galaxy 23.06.2016 03:06
quelle
1

Sie können versuchen

%Vor%

Ruft den Kontext ab, der diese Ansicht enthält, ohne den Wrapper von android.support.v7.widget.TintContextWrapper.

    
yeberiah 08.02.2017 16:19
quelle
0
  
  1. Wie kann ich MyActivity vom TintContextWrapper erhalten?
  2.   

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%     
kcoppock 12.05.2016 20:23
quelle
0

Nach der Aktualisierung der Android Support Libraries funktionierte es für mich.

    
razmik 01.06.2016 09:12
quelle
0

Ich hatte das gleiche Problem und ist mit
gelöst - Android Support Library, Revision 24.2.1 (September 2016)
- compileSdkVersion 24
- buildToolsVersion "24.0.3"

    
Amol 10.10.2016 11:07
quelle