Android support library 23.4.0: android.Unterstützung.v7.- widget.TintContextWrapper nicht geworfen wird, um zu Aktivität
Also habe ich aktualisiert, um die neuesten support-Bibliotheken, und bekam einen crash-ich bin nicht in der Lage, zu beheben. Meine bauen.gradle hat nun diese Abhängigkeiten:
dependencies {
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:gridlayout-v7:23.4.0'
compile 'com.android.support:support-v4:23.4.0'
compile 'com.android.support:cardview-v7:23.4.0'
compile 'com.android.support:recyclerview-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
//More stuff...
}
Hatte ich eine funktionierende Zuhörer, die verwendet wird, zu fangen Klicks und starten Sie eine neue Aktivität. Das war in Ordnung, die in support-Bibliotheken v. 23.1.0, aber nicht in 23.4.0 (und 23.3.0):
public class IngredientItemOnClickListener implements OnClickListener
{
private Ingredient mIngredient;
public IngredientItemOnClickListener(Ingredient ingredient)
{
mIngredient= ingredient;
}
@Override
public void onClick(View view)
{
MyActivity myActivity = (MyActivity) view.getContext(); //<-- crash here
myActivity.showIngredientActivity(mIngredient);
}
}
Dieser listener wird einfach an eine ImageButton
und danach die Farbe der Schaltfläche eingefärbt ist, wie dieser:
Ingredient ingredient = getIngredient();
myImageButton.setOnClickListener(new IngredientItemOnClickListener(ingredient));
Drawable drawable = Tinting.tint(myActivity, R.drawable.my_icon, R.color.red);
myImageButton.setImageDrawable(drawable);
wo Tinting.tint()
ist meine eigene Tönung-Funktion:
public class Tinting
{
@Nullable
public static Drawable tint(Context context, int drawableId, int colorId)
{
final Drawable drawable = ContextCompat.getDrawable(context, drawableId);
if (drawable != null)
{
final Drawable wrapped = DrawableCompat.wrap(drawable);
drawable.mutate();
DrawableCompat.setTint(wrapped, ContextCompat.getColor(context, colorId));
}
return drawable;
}
}
Zuvor wenn ich klickte die Schaltfläche funktioniert alles wie erwartet, aber jetzt ist der Zusammenhang der Ansicht scheint sich verändert zu haben, um TintContextWrapper
die finde ich wenig Informationen darüber. Ich fand dieses Problem, aber die Projekt-Mitarbeiter berät hier Fragen auf StackOverflow, so ist es hier.
Was habe ich versucht?
Seit Beginn des Projekts Mitglied in der Google-Problem angegeben benötigen Sie die Aktivität von umschlossenen Kontext. Ich habe versucht, casting, um TintContextWrapper
statt MyActivity
, welche gut funktioniert, aber ich kann nicht herausfinden, wie man MyActivity
aus TintContextWrapper
.
Also meine Fragen sind:
- Wie bekomme ich
MyActivity
von derTintContextWrapper
? - Warum ist mein
ImageButton
plötzlich eingehüllt in einTintContextWrapper
. - Sollte dieses Verhalten wirklich erwartet?
Definition von ImageButton in xml ist einfach:
<ImageButton
android:id="@+id/my_id"
android:src="@drawable/my_icon" />
Stack trace:
java.lang.ClassCastException: android.support.v7.widget.TintContextWrapper cannot be cast to com.my.app.activities.MyActivity
at com.my.app.listeners.IngredientItemOnClickListener.onClick(IngredientItemOnClickListener.java:21)
at android.view.View.performClick(View.java:4475)
at android.view.View$PerformClick.run(View.java:18786)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
at dalvik.system.NativeStart.main(Native Method)
- Protokolle zeigen
MyItemOnClickListener
. Wo ist es ? - Sorry, es war ein Fehler auf meiner Seite, ich update den stack-trace. Der crash ist in
IngredientItemOnClickListener
die verbunden ist, in Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
sowohl Aktivität n TintContextWRapper kommt aus
ContextWrapper
.ContextWrapper
haben eine MethodegetBaseContext()
. Es sollte einfach zu erstellen Sie eine loop-Methode, die prüftinstanceof WrapContext
, bekommt base-Kontext und prüft danninstanceof Activity
. (Wenn Sie Probleme haben mit dieser Methode Kommentar hier, ich werde Graben, der an einem Projekt von mir und hier einfügen u)Weil AppCompat hüllt Ihren Kontext in der Lage sein zu injizieren "compat" Ansichten und "compat" das Tönen und andere "compat" - Zeug. Das ist normal.
Ja. Das ist, wie AppCompat seine Sache macht.
ContextWrapper
Klassen arbeitete und warum.@Krøllebølle
Antwort auf deine Frage ist :
zunächst ein Klick-Ereignis-code sollte wie:
dann schreiben Funktion getRequiredActivity():
- und Ihrem Absturz/Exception behoben wird 🙂
Mein Vorschlag ist, übergeben Sie einen Verweis von Ihrer Aktivität in den onClickListener zu vermeiden, das Problem mit
TintContextWrapper
. Geben Sie Ihre Klasse eine Referenz aufMyActivity
ist einfach und vermeidet mögliche casting-Probleme.Können Sie versuchen,
Wird der Kontext enthält dieser Ansicht ohne den wrapper von android.Unterstützung.v7.- widget.TintContextWrapper.
Sollten Sie wirklich nicht. Es gibt keine Garantie, dass eine Ansicht der Kontext einer Aktivität -- definitiv nicht eine bestimmte Tätigkeit. Wo sind Sie Einstellung Ihre OnClickListener? Ich gehe davon aus, dass an der Stelle, wo Sie die Zuhörer, Sie haben Zugang zur Tätigkeit. Zum Beispiel, wenn Sie die Einstellung der Hörer aus einer Tätigkeit:
Klappte es bei mir nach der Aktualisierung von Android-Support-Bibliotheken.
Ich Stand vor dem gleichen Problem und wird behoben
- Android Support-Bibliothek, revision 24.2.1 (September 2016)
- compileSdkVersion 24
- buildToolsVersion "24.0.3"