You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android RecyclerView项点击弹出BottomSheetDialog报错求助

解决BottomSheetDialog弹出时的WindowManager$BadTokenException问题

这个错误的核心原因是你给DataAdapter传的是ApplicationContext,而BottomSheetDialog需要绑定到一个Activity的上下文。ApplicationContext是应用全局的上下文,没有对应的Activity窗口令牌,所以无法创建Dialog。

具体修复步骤:

1. 修改DataAdapter的初始化代码

在你的Retrofit回调里,把getApplicationContext()换成当前Activity的实例(比如YourActivityName.this,如果是在Activity内部实现回调,直接用this即可):

Call<List<Datum>> call= requestInterface.getTopRatedMovies(data);
call.enqueue(new Callback<List<Datum>>() {
@Override
public void onResponse(Call<List<Datum>> call, Response<List<Datum>> response) {
dataArrayList = response.body();
Log.e(TAG, "onResponse: "+dataArrayList );
// 替换为Activity上下文,而非ApplicationContext
dataAdapter=new DataAdapter(YourActivityName.this,dataArrayList);
recyclerView.setAdapter(dataAdapter);
}
@Override
public void onFailure(Call<List<Datum>> call, Throwable t) {
Log.e("Error",t.getMessage());
}
});

2. 优化DataAdapter的Dialog创建逻辑(可选但推荐)

为了避免重复创建视图和潜在的内存泄漏,建议调整Dialog的初始化方式,提前绑定视图而非每次点击都重复findViewById:

holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
BottomSheetDialog dialog3 = new BottomSheetDialog((Activity) context);
// 先加载Dialog布局
View dialogView = LayoutInflater.from(context).inflate(R.layout.hire_now, null);
dialog3.setContentView(dialogView);

// 一次性绑定所有需要的视图
TextView tvMainFare = dialogView.findViewById(R.id.tvMainFare);
TextView tvRegularFare = dialogView.findViewById(R.id.tvRegularFare);
Button btn_hire_now = dialogView.findViewById(R.id.btn_hire_now);
TextView tvDriver = dialogView.findViewById(R.id.tvDriver);
TextView tvKMaway = dialogView.findViewById(R.id.tvKMaway);
TextView tvDelete = dialogView.findViewById(R.id.tvDelete);
TextView tvReport = dialogView.findViewById(R.id.tvReport);
TextView tvPosition = dialogView.findViewById(R.id.tvPosition);

// 这里可以给Dialog的视图设置当前item的数据,比如
tvMainFare.setText(dataList.get(position).getTotal_fare());

dialog3.show();
}
});

为什么Toast可以正常显示?

Toast是系统托管的临时通知组件,它允许使用ApplicationContext,不需要绑定到特定Activity的窗口,所以不会触发令牌错误。

内容的提问来源于stack exchange,提问作者roy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:02:47