So, I upgraded to the latest support libraries and got a crash that I cannot fix. Now my build.gradle has these dependencies:
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... }
I had a working listener, which is used to capture clicks and launch a new action. This worked fine in the support libraries of version 23.1.0, but not in 23.4.0 (and 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); } }
This listener is simply bound to an ImageButton , and then the button color is colored as follows:
Ingredient ingredient = getIngredient(); myImageButton.setOnClickListener(new IngredientItemOnClickListener(ingredient)); Drawable drawable = Tinting.tint(myActivity, R.drawable.my_icon, R.color.red); myImageButton.setImageDrawable(drawable);
where Tinting.tint() is my own toning function:
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; } }
Previously, when I clicked the button, everything worked as expected, but now the view context seems to have changed to TintContextWrapper , about which I can find little information. I found this problem , but a project member advises setting StackOverflow here, so here it is.
What have i tried?
Since a project member on the Google release stated that you would need to get activity out of a wrapped context. I tried casting TintContextWrapper instead of MyActivity , which works fine, but I can't figure out how to get MyActivity from TintContextWrapper .
So my questions are:
- How can I get
MyActivity from TintContextWrapper ? - Why is my
ImageButton unexpectedly wrapped in a TintContextWrapper . - Should this behavior really be expected?
The definition of ImageButton in xml is simple:
<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)