gpt4 book ai didi

Android 支持库 23.4.0 : android. support.v7.widget.TintContextWrapper 无法转换到 Activity

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:03 25 4
gpt4 key购买 nike

所以我更新到最新的支持库,遇到了一个我无法修复的崩溃。我的 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;
}
}

以前,当我单击按钮时,一切都按预期工作,但现在 View 的上下文似乎已更改为 TintContextWrapper,我几乎找不到相关信息。我找到了 this issue , 但项目成员建议在 StackOverflow 上询问这里,所以在这里。

我尝试了什么?

由于 Google 问题中的项目成员声明您需要从包装的上下文中获取 Activity 。我尝试转换为 TintContextWrapper 而不是 MyActivity,工作正常,但我不知道如何从 TintContextWrapper 获取 MyActivity

所以我的问题是:

  1. 如何从 TintContextWrapper 获取 MyActivity
  2. 为什么我的 ImageButton 突然包裹在 TintContextWrapper 中。
  3. 真的应该预料到这种行为吗?

ImageButton在xml中的定义很简单:

<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)

最佳答案

  1. 两个 Activity n TintContextWRapper 来自 ContextWrapperContextWrapper 有一个方法 getBaseContext()。创建一个检查 instanceof WrapContext、获取基本上下文然后检查 instanceof Activity 的循环方法应该很容易。 (如果您对此方法有疑问,请在此处评论,我将挖掘我的一些项目并粘贴到此处)

  2. 因为 AppCompat 包装了您的上下文,以便能够注入(inject)“兼容” View 和“兼容”着色以及其他“兼容”内容。这很正常。

  3. 是的。这就是 AppCompat 的工作方式。

关于Android 支持库 23.4.0 : android. support.v7.widget.TintContextWrapper 无法转换到 Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37196284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com