Android Spinner重置选中项出现FAILED Binder Transaction错误怎么办
问题原因分析
- 核心错误:按钮点击逻辑陷入无限递归
你写的按钮点击回调中,if(DeselBtn.performClick())这段逻辑完全错误:onClick本身就是按钮被点击后触发的回调,而performClick()方法的作用就是主动触发按钮的点击事件,相当于每次点击按钮都会再次触发点击回调,形成死循环,大量重复调用Spinner的setSelection方法和选中回调,最终超出binder事务的调用限制抛出错误。 - 次要优化点:你给每个Spinner单独写匿名内部类的选中监听代码冗余度很高,后续维护麻烦,可以封装成通用监听类减少重复代码。
修正方案
首先删除按钮点击事件里完全多余的performClick()判断,修正后的按钮点击逻辑如下:
DeselBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { // 直接执行重置逻辑即可,不需要额外调用performClick SpinnerZ1.setSelection(0); SpinnerZ2.setSelection(0); // 剩下的10个Spinner也在这里添加setSelection(0)即可 } });
如果要进一步优化重复的选中监听代码,可以封装通用的Spinner选中监听器:
// 封装通用的选中变色监听 public class ZoneSpinnerSelectListener implements AdapterView.OnItemSelectedListener { private final Spinner targetSpinner; public ZoneSpinnerSelectListener(Spinner spinner) { this.targetSpinner = spinner; } @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { if (position > 0) { targetSpinner.setBackgroundColor(0xb000A000); } else { targetSpinner.setBackgroundColor(0xFFCFE2F3); } } @Override public void onNothingSelected(AdapterView<?> parent) {} }
之后每个Spinner设置监听只需要一行代码,大幅减少重复代码:
SpinnerZ1.setOnItemSelectedListener(new ZoneSpinnerSelectListener(SpinnerZ1)); SpinnerZ2.setOnItemSelectedListener(new ZoneSpinnerSelectListener(SpinnerZ2)); // 其余10个Spinner同理
内容的提问来源于stack exchange,提问作者E_Blue
相关产品推荐
相关产品推荐

