You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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) {

                }
            });
        }
    }
}

关键修改点说明

  1. 修复第二个RadioButton的Listener结构:在checkedId==R.id.RB分支里,完整实现new AdapterView.OnItemSelectedListener()的匿名类,把两个@Override方法包裹在大括号内,解决语法错误,消除“Multiple choices”提示。
  2. 补充RadioGroup监听初始化:在onCreate里添加rg.setOnCheckedChangeListener(this);,确保RadioButton选中后能触发onCheckedChanged方法(原代码漏了这一步,会导致RadioButton选中后完全没反应)。
  3. 优化分支判断:把第二个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:51:39