Android中如何获取动态创建的Spinner选中值?
问题根源
你当前的代码里用了一个全局的spinner变量来存储动态创建的Spinner组件,但在循环生成多行表格的过程中,这个变量会被每一次新创建的Spinner覆盖。最终,所有按钮的点击事件都会访问同一个spinner变量(也就是最后一个创建的Spinner),这就导致你无法获取对应行的Spinner选中值。
解决方案
这里提供两种简单有效的修复方式,你可以根据自己的代码结构选择:
方案1:用数组存储所有Spinner,和按钮ID对应
和你存储按钮的myButton数组类似,我们也可以创建一个Spinner数组来保存每一行的Spinner引用:
步骤1:定义Spinner数组
在类里声明一个和按钮数组同长度的Spinner数组:
Spinner[] mySpinners;
在初始化表格前,记得初始化这个数组(比如和myButton一起初始化):
mySpinners = new Spinner[tempBranch.length]; // 假设tempBranch是你的数据源数组
步骤2:保存每个Spinner的引用
在创建Spinner的代码块里,把当前Spinner存入数组:
spinner = new Spinner(this); // ... 省略Adapter设置等代码 ... tbrow.addView(spinner); mySpinners[i] = spinner; // 保存当前行的Spinner
步骤3:点击按钮时获取对应Spinner的值
修改按钮点击事件的代码,通过按钮ID获取对应数组位置的Spinner:
private View.OnClickListener btnClick2(final Button button) { return new View.OnClickListener(){ public void onClick(View v){ idEmpl = id[v.getId()]; // 通过按钮ID拿到对应行的Spinner Spinner targetSpinner = mySpinners[v.getId()]; tmpBranch = targetSpinner.getSelectedItem().toString(); // ... 后续逻辑 ... } }; }
方案2:用setTag()把Spinner绑定到对应按钮上
这种方式不需要额外维护数组,直接把当前行的Spinner绑定到按钮的Tag属性上,点击时再取出来:
步骤1:绑定Spinner到按钮
在创建按钮的代码里,添加一行绑定Tag的代码:
final Button rowButton2 = new Button(this); rowButton2.setText("OK"); rowButton2.setId(i); // 把当前行的Spinner绑定到按钮的Tag上 rowButton2.setTag(spinner); tbrow.addView(rowButton2); myButton[i] = rowButton2; myButton[i].setOnClickListener(btnClick2(rowButton2));
步骤2:点击按钮时从Tag中获取Spinner
修改点击事件的代码:
private View.OnClickListener btnClick2(final Button button) { return new View.OnClickListener(){ public void onClick(View v){ idEmpl = id[v.getId()]; // 从按钮的Tag中取出对应的Spinner Spinner targetSpinner = (Spinner) button.getTag(); tmpBranch = targetSpinner.getSelectedItem().toString(); // ... 后续逻辑 ... } }; }
这两种方式都能解决你的问题,推荐方案2,因为它更简洁,不需要额外维护数组,减少出错的可能。
内容的提问来源于stack exchange,提问作者evgeny
相关产品推荐
相关产品推荐

