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
相关产品推荐
相关产品推荐

