为了账号安全,请及时绑定邮箱和手机立即绑定

android.view.ContextThemeWrapper 不能转换为

android.view.ContextThemeWrapper 不能转换为

阿晨1998 2021-06-10 16:02:17
我不是设计师,但是当我得到这个项目时,我无法打开一些屏幕,我认为它们是屏幕,我们只重用了一些已经创建的布局。无论如何有人可以帮助我吗?@Override public void onBindViewHolder(@NonNull final ProductsAdapter.ViewHolder holder, final int position) { String imageUrl = ProductsList.get(position).getImage();    holder.itemName.setText(ProductsList.get(position).getName());    Picasso.with(context).load(imageUrl).into(holder.itemImage);    holder.parentLayot.setOnClickListener(new View.OnClickListener() {        public String currentActivity;        @Override        public void onClick(View v) {            Activity activity = (Activity) v.getContext();            activity.runOnUiThread(bd);            String activityName = activity.getClass().getSimpleName();            // Toast.makeText(activity,ProductsList.get(position).getId(),Toast.LENGTH_SHORT).show();            if (activityName.equals("Product_View")){                // Toast.makeText(activity,"Click and pass",Toast.LENGTH_SHORT).show();                Intent intent = new Intent(activity, Second_Product_View.class);                intent.putExtra("item_name", ProductsList.get(position).getName());                intent.putExtra("item_id", ProductsList.get(position).getId());                intent.putExtra("item_category_name", ProductsList.get(position).getName());                intent.putExtra("item_category_id", ProductsList.get(position).getId());                activity.startActivity(intent);            } 
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

这一行可能是罪魁祸首:


Activity activity = (Activity) v.getContext();

的观点v传递给onClick()方法是相同的观点,即你分配听者,所以v是一样的holder.parentLayot。我不知道确切holder.parentLayot来自哪里,但很有可能(在 XML 中)此视图(或其父视图之一)具有android:theme属性。


当视图具有该android:theme属性时,它不会直接使用其活动的上下文。相反,android 框架会将 Activity 的上下文“包装”在 aContextThemeWrapper中以修改视图的主题。


要从此包装器访问活动,您必须“解开”它。尝试这样的事情:


private static Activity unwrap(Context context) {

    while (!(context instanceof Activity) && context instanceof ContextWrapper) {

        context = ((ContextWrapper) context).getBaseContext();

    }


    return (Activity) context;

}

然后,您可以在您的onClick()而不是直接转换上下文中使用此方法:


Activity activity = unwrap(v.getContext());


查看完整回答
反对 回复 2021-06-23
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

Kotlin 中的递归解决方案:


fun Context.getActivity(): Activity? {

    return when (this) {

        is Activity -> this

        is ContextWrapper -> this.baseContext.getActivity()

        else -> null

    }

}

检查使用情况View.getContext()。




查看完整回答
反对 回复 2021-06-23
?
慕慕森

TA贡献1856条经验 获得超17个赞

简单地使用上下文就可以了


FragmentManager fragmentManager = ((AppCompatActivity) context).getSupportFragmentManager();


查看完整回答
反对 回复 2021-06-23
  • 3 回答
  • 0 关注
  • 282 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信