无法在 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
而不是 this
或 getApplicationContext()
来解决它。
无法解决为:: 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
而不是 this
或 getApplicationContext()
来解决它。