无法解决为::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;
}
最佳答案
我认为您可以使用以下代码 fragment 来解决您的问题。但我建议您不要这样做,主要有两个原因。
- 既然您明确只需要 Activity,为什么不将其发送出去,甚至更好地实现一个回调接口(interface)。
- 如果明天这将发生更改,并且
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 回调的 fragment
public interface MyAdapterListener {
void onPlaceClick();
}
然后当您创建适配器的实例时,您可以像这样传递它
public BookingActivityAdapter(MyAdapterListener myAdapterListener){
this.myAdapterListener = myAdapterListener;
}
请务必在您的 Activity 中实现此接口(interface)。最后,在您的 onClick
中,您可以按如下方式使用此界面
holder.ivPlace.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myAdapterListener.onPlaceClick();
}
});
关于android - ContextThemeWrapper 无法在 AppCompatActivity 中进行强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67867914/