Android多单位转换器开发:Spinner选中单位后实现转换功能的问题
Android多单位转换器代码修正方案
核心问题排查
你的代码存在以下关键问题导致转换功能失效:
- 单位判断逻辑错误:
if (spinnerdropdown.this=="Weight")是将Activity实例与字符串直接比较,永远不会成立,必须获取Spinner选中的实际选项文本。 - 缺少输入合法性校验:未处理EditText为空或输入非数字的情况,会触发
NumberFormatException导致崩溃。 - 转换逻辑单一:仅实现了重量的单方向转换,结构可优化以支持更多单位类别。
修正后的完整代码
public class spinnerdropdown extends AppCompatActivity { TextView textView1; CardView crdvspinner; Spinner unitspinner; EditText edtinputspinner; Button convertbtnspinner; TextView txtvresultspinner; String[] unitarray = {"Currency", "Weight", "Liquid", "Temperature", "Area", "Length"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_spinnerdropdown); textView1 = findViewById(R.id.textView1); crdvspinner = findViewById(R.id.crdvspinner); unitspinner = findViewById(R.id.unitspinner); edtinputspinner = findViewById(R.id.edtinputspinner); convertbtnspinner = findViewById(R.id.convertbtnspinner); txtvresultspinner = findViewById(R.id.txtvresultspinner); ArrayAdapter<String> adapter = new ArrayAdapter<>(spinnerdropdown.this, android.R.layout.simple_spinner_item, unitarray); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); unitspinner.setAdapter(adapter); unitspinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { String value = adapterView.getItemAtPosition(i).toString(); Toast.makeText(spinnerdropdown.this, value, Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> adapterView) { } }); convertbtnspinner.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String inputStr = edtinputspinner.getText().toString().trim(); // 输入合法性校验 if (inputStr.isEmpty()) { txtvresultspinner.setText("请输入数值"); return; } double inputValue; try { inputValue = Double.parseDouble(inputStr); } catch (NumberFormatException e) { txtvresultspinner.setText("请输入有效数字"); return; } // 获取选中的单位类别 String selectedUnit = unitspinner.getSelectedItem().toString(); double result = 0; String resultText = ""; // 根据不同单位类别执行转换逻辑 switch (selectedUnit) { case "Weight": // 千克转磅示例 result = inputValue * 2.205; resultText = inputValue + " 千克 = " + String.format("%.3f", result) + " 磅"; break; case "Temperature": // 摄氏度转华氏度示例 result = (inputValue * 9/5) + 32; resultText = inputValue + " ℃ = " + String.format("%.1f", result) + " ℉"; break; case "Length": // 米转英尺示例 result = inputValue * 3.28084; resultText = inputValue + " 米 = " + String.format("%.3f", result) + " 英尺"; break; default: resultText = "暂未支持该类别转换"; break; } txtvresultspinner.setText(resultText); } }); } }
关键修改说明
- 正确获取选中单位:通过
unitspinner.getSelectedItem().toString()获取Spinner当前选中的单位类别,替代原错误的实例比较逻辑。 - 输入校验:添加空值检查与异常捕获,避免非法输入导致崩溃,并给用户明确提示。
- 结构化转换逻辑:使用
switch-case替代单一if判断,便于后续扩展更多单位类别的转换规则。 - 友好结果展示:格式化结果字符串,显示原单位与转换后的单位,提升用户体验。
内容的提问来源于stack exchange,提问作者Muhammad Aamir
相关产品推荐
相关产品推荐

