【发布时间】:2016-05-12 19:54:32
【问题描述】:
所以我更新到了最新的支持库,但出现了一个我无法修复的崩溃。我的 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。这在支持库 v. 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,然后按钮的颜色被着色,如下所示:
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;
}
}
以前当我单击按钮时,一切都按预期工作,但现在视图的上下文似乎已更改为 TintContextWrapper,我几乎找不到相关信息。我找到了this issue,但是项目成员建议在StackOverflow上问这里,所以在这里。
我尝试了什么?
由于 Google 问题中的项目成员声明 您将需要从包装的上下文中获取活动。 我尝试转换为 TintContextWrapper 而不是 MyActivity,效果很好,但我无法弄清楚如何从TintContextWrapper 获取MyActivity。
所以我的问题是:
- 如何从
TintContextWrapper获取MyActivity? - 为什么我的
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)
【问题讨论】:
-
日志描述
MyItemOnClickListener。它在哪里? -
对不起,我这边出现错误,我更新了堆栈跟踪。崩溃发生在问题中的
IngredientItemOnClickListener。
标签: android android-support-library