【问题标题】:ContextThemeWrapper cannot be cast in AppCompatActivityContextThemeWrapper 不能在 AppCompatActivity 中强制转换
【发布时间】:2021-06-07 07:57:33
【问题描述】:

无法解决为:: java.lang.ClassCastException: android.view.ContextThemeWrapper 无法强制转换为 androidx.appcompat.app.AppCompatActivity。
浏览了各种网站,但无法解决我的问题。

holder.ivPlace.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                AppCompatActivity activity = (AppCompatActivity) v.getContext();
                Fragment myFragment = new BookingDetailsFragment();
                activity.getSupportFragmentManager().beginTransaction().replace(R.id.bookingFragment, myFragment)
                        .addToBackStack(null).commit();



            }
        });

布局是这样膨胀的::

@NonNull
    @Override
    public BookingActivityAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_booking_data, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;

    }

【问题讨论】:

  • @StanislavBondar 实际上我正在替换片段,所以我在发布之前遵循了这个答案,但是 getSupportFragmentManager() 无法通过显示红线错误来工作。任何帮助将不胜感激。 activity.getSupportFragmentManager().beginTransaction().replace(R.id.bookingFragment, myFragment).addToBackStack(null).commit();

标签: android fragment adapter


【解决方案1】:

我知道已经晚了,但我通过传递 MyActivity.this 而不是 thisgetApplicationContext() 解决了这个问题。

【讨论】:

    【解决方案2】:

    我认为您可以使用以下 sn-p 来解决您的问题。但我建议您不要这样做,主要有两个原因。

    • 既然您明确地只需要 Activity,为什么不通过发送它或者更好地实现回调接口。
    • 如果明天这会发生变化,View 会有其他上下文怎么办?
    /**
     * Get activity instance from desired context.
     */
    public static Activity getActivity(Context context) {
        if (context == null) return null;
        if (context instanceof Activity) return (Activity) context;
        if (context instanceof ContextWrapper) return getActivity(((ContextWrapper)context).getBaseContext());
        return null;
    }
    

    编辑:活动回调的片段

    public interface MyAdapterListener {
            void onPlaceClick();
        }
    

    然后当您创建适配器的实例时,您可以像这样传递它

    public BookingActivityAdapter(MyAdapterListener myAdapterListener){
            this.myAdapterListener = myAdapterListener;
    }
    

    请务必在您的活动中实现此接口。然后最后在你的onClick里面你可以使用这个接口如下

    holder.ivPlace.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    myAdapterListener.onPlaceClick();
    
                }
            });
    

    【讨论】:

    • 确实如此,上面的代码替换片段该怎么办,因为getSupportFragmentManager不起作用!!你不介意给它一些亮点吗?
    • 通过接口实现回调到您的活动,因此当您执行点击操作时,它会返回到您的活动,然后您可以直接执行交易。我会在答案中为您添加一些伪 sn-ps。 @HubbyTiwari。
    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 2021-06-25
    • 2015-09-03
    • 2019-06-09
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多