Android开发:Spinner的onItemSelected异常及参数报错修复求助
解决你的两个Android开发问题
嘿,我帮你梳理下这两个问题的核心原因,以及对应的修复方案:
问题1:第二个RadioButton的onItemSelected显示“Multiple choices”
这个提示是因为你在checkedId==R.id.RB的分支里,没有正确创建AdapterView.OnItemSelectedListener的匿名内部类,直接裸写了@Override方法,导致代码结构完全混乱,IDE无法正确解析语法,从而抛出异常提示。
问题2:第二个onItemSelected的parent参数标红
这可不是parent重名的问题哦——匿名内部类的参数是局部作用域,不同匿名类里的parent变量完全独立,不会互相干扰。标红只是因为你没把第二个onItemSelected和onNothingSelected方法包裹在new AdapterView.OnItemSelectedListener()的大括号里,语法错误导致IDE识别失败。
修正后的完整代码
public class Main2Activity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener { public TextView ttkalorisehari, ttkaloriseminggu,txtbb; double naik_bb, kt; Spinner kcpt; String[] kecepatan = {"...","Jalan kaki santai (3mph)","Jalan kaki cepat (4mps - 5mmps)", "Jalan kaki menaiki bukit (3,5mph)","Jalan kaki turun bukit (2,5mph)","Naik tangga (3mph)"}; ArrayAdapter<String> adapter; RadioButton umurA, umurB; RadioGroup rg; Button bhitung; double kcptjalan; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); Bundle data = getIntent().getExtras(); ttkalorisehari = (TextView)findViewById(R.id.tjml_kal); ttkaloriseminggu = (TextView)findViewById(R.id.tjml_kal_seminggu); txtbb = (TextView)findViewById(R.id.tnaik_bb); kcpt =(Spinner)findViewById(R.id.kecepatan); rg = (RadioGroup)findViewById(R.id.rg); umurA = (RadioButton)findViewById(R.id.RA); umurB = (RadioButton)findViewById(R.id.RB); bhitung = (Button)findViewById(R.id.btnhitung); ttkalorisehari.setText(data.getString("kalorisehari")); ttkaloriseminggu.setText(data.getString("kaloriseminggu")); adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,kecepatan); kcpt.setAdapter(adapter); try { double nilai_bb = Double.parseDouble(ttkaloriseminggu.getText().toString()); DecimalFormat df = new DecimalFormat("#.##"); naik_bb = (Double.valueOf(nilai_bb)/7000); txtbb.setText(df.format(naik_bb)); }catch (Exception e){ Toast.makeText(getApplicationContext(),"Isi kolom kosong",Toast.LENGTH_LONG).show(); } // 补充:初始化RadioGroup的选中监听,原代码漏了这一步 rg.setOnCheckedChangeListener(this); } @Override public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) { if(checkedId==R.id.RA){ kcpt.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { switch (position){ case 0: kcptjalan = 0; break; case 1: kcptjalan = 0.3; break; case 2: kcptjalan = 0.16; break; case 3: kcptjalan = 0.17; break; case 4: kcptjalan = 0.12; break; case 5: kcptjalan = 0.37; break; } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } else if (checkedId==R.id.RB){ // 修复:完整创建匿名内部类,把方法包裹在大括号内 kcpt.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id){ switch (position) { case 0: kcptjalan = 0; break; case 1: kcptjalan = 0.23; break; case 2: kcptjalan = 0.12; break; case 3: kcptjalan = 0.13; break; case 4: kcptjalan = 0.13; break; case 5: kcptjalan = 0.27; break; } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } } }
关键修改点说明
- 修复第二个RadioButton的Listener结构:在
checkedId==R.id.RB分支里,完整实现new AdapterView.OnItemSelectedListener()的匿名类,把两个@Override方法包裹在大括号内,解决语法错误,消除“Multiple choices”提示。 - 补充RadioGroup监听初始化:在
onCreate里添加rg.setOnCheckedChangeListener(this);,确保RadioButton选中后能触发onCheckedChanged方法(原代码漏了这一步,会导致RadioButton选中后完全没反应)。 - 优化分支判断:把第二个
if改成else if,逻辑更清晰,避免不必要的判断。
额外优化建议
你当前每次选中RadioButton都会重新创建一个OnItemSelectedListener实例,有点浪费资源。可以提前定义两个Listener变量,在onCreate里初始化,选中时直接设置:
// 提前定义两个Listener实例 private AdapterView.OnItemSelectedListener listenerA; private AdapterView.OnItemSelectedListener listenerB; @Override protected void onCreate(Bundle savedInstanceState) { // ...其他代码... // 初始化Listener listenerA = new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // ...RA对应的逻辑... } @Override public void onNothingSelected(AdapterView<?> parent) {} }; listenerB = new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // ...RB对应的逻辑... } @Override public void onNothingSelected(AdapterView<?> parent) {} }; rg.setOnCheckedChangeListener(this); } @Override public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) { if(checkedId==R.id.RA){ kcpt.setOnItemSelectedListener(listenerA); } else if (checkedId==R.id.RB){ kcpt.setOnItemSelectedListener(listenerB); } }
这样代码更整洁,也避免了重复创建对象。
内容的提问来源于stack exchange,提问作者husen
相关产品推荐
相关产品推荐

