因此,我更新到了最新的支持库,但崩溃了,我无法修复。我的build.gradle现在具有以下依赖项:
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...
}
我有一个工作的监听器,用于捕获点击并启动新的 Activity 。在支持库23.1.0版中运行良好,但在23.4.0(和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);
}
}
将该监听器简单地附加到
ImageButton
上,然后将Button的颜色着色,如下所示:Ingredient ingredient = getIngredient();
myImageButton.setOnClickListener(new IngredientItemOnClickListener(ingredient));
Drawable drawable = Tinting.tint(myActivity, R.drawable.my_icon, R.color.red);
myImageButton.setImageDrawable(drawable);
其中
Tinting.tint()
是我自己的着色函数: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;
}
}
以前,当我单击按钮时,一切都按预期工作,但是现在,“ View 的上下文”似乎已更改为
TintContextWrapper
,我几乎找不到有关它的信息。我找到了this issue,但是项目成员建议在StackOverflow上提问,就在这里。我尝试了什么?
由于Google问题中的项目成员说过,您将需要从包装的上下文中获取 Activity 。我尝试强制转换为
TintContextWrapper
而不是MyActivity
,效果很好,但是我不知道如何从MyActivity
中获取TintContextWrapper
。所以我的问题是:
MyActivity
获取TintContextWrapper
? ImageButton
突然包裹在TintContextWrapper
中。 xml中ImageButton的定义很简单:
<ImageButton
android:id="@+id/my_id"
android:src="@drawable/my_icon" />
堆栈跟踪:
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)
最佳答案
ContextWrapper
。 ContextWrapper
具有方法getBaseContext()
。创建一个检查instanceof WrapContext
,获取基本上下文然后检查instanceof Activity
的循环方法应该很容易。 (如果您对此方法有问题,请在此处评论,我将在我的某个项目上进行挖掘并将其粘贴到u上)关于Android支持库23.4.0 : android. support.v7.widget.TintContextWrapper无法转换为Activity,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37196284/