android.view.ContextThemeWrapper无法强制转换为android.app.Activity

Mau*_*ano 3 java android android-studio

我不是设计师,但是当我得到这个项目时,我不能打开一些屏幕,我认为它们是屏幕,我们只重用了一些已经创建的布局.无论如何可以有人帮助我吗?@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);
            } else if(activityName.equals("Second_Product_View")){
                Intent intent = new Intent(activity, Third_Product_View.class);

                intent.putExtra("item_category_name", activity.getIntent().getStringExtra("item_category_name"));
                intent.putExtra("item_category_id", activity.getIntent().getStringExtra("item_category_id"));

                intent.putExtra("item_subcategory_name", ProductsList.get(position).getName());
                intent.putExtra("item_subcategory_id", ProductsList.get(position).getId());

                intent.putExtra("item_name", ProductsList.get(position).getName());
                intent.putExtra("item_id", ProductsList.get(position).getId());

                activity.startActivity(intent);
            } else if(activityName.equals("Third_Product_View")){
                Intent intent = new Intent(activity, Fourth_Product_View.class);

                intent.putExtra("item_category_name", activity.getIntent().getStringExtra("item_category_name"));
                intent.putExtra("item_category_id", activity.getIntent().getStringExtra("item_category_id"));

                intent.putExtra("item_subcategory_name", activity.getIntent().getStringExtra("item_subcategory_name"));
                intent.putExtra("item_subcategory_id", activity.getIntent().getStringExtra("item_subcategory_id"));

                intent.putExtra("item_section_name", ProductsList.get(position).getName());
                intent.putExtra("item_section_id", ProductsList.get(position).getId());

                intent.putExtra("item_name", ProductsList.get(position).getName());
                intent.putExtra("item_id", ProductsList.get(position).getId());
                activity.startActivity(intent);
            } else if(activityName.equals("Fourth_Product_View")){
                holder.downloadManager = (DownloadManager)activity.getSystemService(Context.DOWNLOAD_SERVICE);
                String file = activity.getString(R.string.base_url) + "files/example-" + ProductsList.get(position).getId() + ".pdf";
                Uri uri = Uri.parse(file);
                DownloadManager.Request request = new DownloadManager.Request(uri);
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                Long reference = holder.downloadManager.enqueue(request);
            } else if (activityName.equals("Formation_View")){
                Intent intent = new Intent(activity, Second_Formation_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);
            } else if(activityName.equals("Second_Formation_View")){
                Intent intent = new Intent(activity, Third_Formation_View.class);

                intent.putExtra("item_category_name", activity.getIntent().getStringExtra("item_category_name"));
                intent.putExtra("item_category_id", activity.getIntent().getStringExtra("item_category_id"));

                intent.putExtra("item_subcategory_name", ProductsList.get(position).getName());
                intent.putExtra("item_subcategory_id", ProductsList.get(position).getId());

                intent.putExtra("item_name", ProductsList.get(position).getName());
                intent.putExtra("item_id", ProductsList.get(position).getId());

                activity.startActivity(intent);
            } else if(activityName.equals("Third_Formation_View")){
                holder.downloadManager = (DownloadManager)activity.getSystemService(Context.DOWNLOAD_SERVICE);
                String file = activity.getString(R.string.base_url) + "files/example-" + ProductsList.get(position).getId() + ".pdf";
                Uri uri = Uri.parse(file);
                DownloadManager.Request request = new DownloadManager.Request(uri);
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                Long reference = holder.downloadManager.enqueue(request);
            } else if (activityName.equals("Tools_View")){
                Intent intent = new Intent(activity, Second_Tools_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);
            } else if(activityName.equals("Second_Tools_View")){
                holder.downloadManager = (DownloadManager)activity.getSystemService(Context.DOWNLOAD_SERVICE);
                String file = activity.getString(R.string.base_url) + "files/example-" + ProductsList.get(position).getId() + ".pdf";
                Uri uri = Uri.parse(file);
                DownloadManager.Request request = new DownloadManager.Request(uri);
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                Long reference = holder.downloadManager.enqueue(request);
            }

        }
    });
} 
Run Code Online (Sandbox Code Playgroud)

并且logcat显示了这一点

java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to android.app.Activity

    at android.view.View.performClick(View.java:6256)
    at android.view.View$PerformClick.run(View.java:24701)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at 
Run Code Online (Sandbox Code Playgroud)

int*_*_32 12

Kotlin 中的递归解决方案:

fun Context.getActivity(): Activity? {
    return when (this) {
        is Activity -> this
        is ContextWrapper -> this.baseContext.getActivity()
        else -> null
    }
}
Run Code Online (Sandbox Code Playgroud)

检查使用情况View.getContext()


Ben*_* P. 10

这条线可能是罪魁祸首:

Activity activity = (Activity) v.getContext();
Run Code Online (Sandbox Code Playgroud)

的观点v传递给onClick()方法是分配听者同样的观点,所以v是一样的holder.parentLayot.我不确切知道holder.parentLayot从哪里来的,但是(在XML中)这个视图(或其父节点之一)具有android:theme属性的机会非常好.

当视图具有该android:theme属性时,它不直接使用其活动的上下文.相反,android框架将"包装"活动的上下文ContextThemeWrapper,以便修改视图的主题.

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

private static Activity unwrap(Context context) {
    while (!(context instanceof Activity) && context instanceof ContextWrapper) {
        context = ((ContextWrapper) context).getBaseContext();
    }

    return (Activity) context;
}
Run Code Online (Sandbox Code Playgroud)

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

Activity activity = unwrap(v.getContext());
Run Code Online (Sandbox Code Playgroud)