因此,我更新到了最新的支持库,但崩溃了,我无法修复。我的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)
    

    最佳答案

  • 两者的 Activity n TintContextWRapper都来自ContextWrapperContextWrapper具有方法getBaseContext()。创建一个检查instanceof WrapContext,获取基本上下文然后检查instanceof Activity的循环方法应该很容易。 (如果您对此方法有问题,请在此处评论,我将在我的某个项目上进行挖掘并将其粘贴到u上)
  • 因为AppCompat会包装您的上下文,以便能够注入(inject)“compat” View 以及“compat”着色和其他“compat”内容。那很正常
  • 是的。这就是AppCompat的工作方式。
  • 关于Android支持库23.4.0 : android. support.v7.widget.TintContextWrapper无法转换为Activity,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37196284/

    10-10 10:36