Android开发中Button点击无法触发onClick事件问题排查求助
问题根源
你在onCreate方法中重复调用了两次setContentView:
- 第一次调用
setContentView(R.layout.activity_setup_fridge)后,你查找了Button控件并绑定了点击事件,但该事件绑定的是第一次加载的布局内的按钮实例 - 后续你又执行了
binding = ActivitySetupFridgeBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot());,这一步会将Activity的显示布局替换为ViewBinding新实例化的布局,之前绑定了点击事件的按钮已经不在当前显示的视图树中,你实际看到的按钮是新布局里未绑定任何点击事件的实例,因此点击无响应。
修复方案
统一使用ViewBinding操作所有控件,不要混合使用findViewById和ViewBinding,修改后的onCreate参考代码如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().hide(); // 仅保留ViewBinding的初始化和布局设置 binding = ActivitySetupFridgeBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); // 所有控件统一通过binding获取 listView = binding.listItem; searchView = binding.searchViewSetup; // 变量名以实际生成的ViewBinding驼峰命名为准,下划线命名会自动转驼峰 btn = binding.setupFloatingBtn; btn.bringToFront(); btn.setOnClickListener(this); // 后续原有逻辑保持不变 ArrayList<Ingredient> ingredientArrayList = new ArrayList<>(); for (int i = 0; i < images.length; i++) { Ingredient ingredient = new Ingredient(ingredients[i], images[i], checkboxes[i]); ingredientArrayList.add(ingredient); } ListAdapter listAdapter = new ListAdapter(SetupActivity.this, ingredientArrayList); binding.listItem.setTextFilterEnabled(true); binding.listItem.setAdapter(listAdapter); binding.listItem.setClickable(true); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { listAdapter.getFilter().filter(query); return false; } @Override public boolean onQueryTextChange(String newText) { listAdapter.getFilter().filter(newText); return false; } }); binding.listItem.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Ingredient ig = (Ingredient) parent.getItemAtPosition(position); ig.setIngredientCheckBox(!ig.isIngredientCheckBox()); CheckBox cb = view.findViewById(R.id.ingredientChekcBox); cb.setChecked(!cb.isChecked()); } }); }
其他需要修正的问题
- 当前
onClick方法里的跳转逻辑缺少startActivity(intent)调用,就算点击事件触发也不会完成页面跳转,记得补充 - 复选框的选中状态仅更新了
Ingredient实例的属性,没有同步更新全局的checkboxes数组,最后遍历checkboxes统计选中项时无法拿到正确结果,建议直接遍历listAdapter内的Ingredient列表统计选中项,无需额外维护全局checkboxes数组。
内容的提问来源于stack exchange,提问作者marblo
相关产品推荐
相关产品推荐

