无法在 AppCompatActivity 中投射 ContextThemeWrapper

ContextThemeWrapper cannot be cast in AppCompatActivity

无法解决为:: 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;

    }

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

  • 既然你明确地只需要 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;
}

编辑:回调到 activity

的片段
public interface MyAdapterListener {
        void onPlaceClick();
    }

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

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

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

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

                myAdapterListener.onPlaceClick();

            }
        });

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