在 Spinner 的 OnItemSelectedListener 中獲取選中項文本並設置給 TextView,是常見交互需求。關鍵在於正確獲取選中數據。
Spinner spinner = findViewById(R.id.spinner);
TextView textView = findViewById(R.id.textView);
ArrayAdapter adapter = ArrayAdapter.createFromResource(
this, R.array.currencies, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
// 方法一:直接從 parent 獲取
String selectedText = parent.getItemAtPosition(position).toString();
textView.setText(selectedText);
// 方法二:從 spinner 獲取(等效)
// textView.setText(spinner.getSelectedItem().toString());
}
@Override
public void onNothingSelected(AdapterView> parent) {
// 可選:清空或設置默認文本
textView.setText("");
}
});
若使用自定義 Adapter(如包含圖標、多行文本),需從綁定的數據源獲取:
// 假設數據源為 List currencies
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
Currency selected = currencies.get(position);
textView.setText(selected.getName() + " (" + selected.getCode() + ")");
}
// ...
});
setAdapter 會觸發一次 onItemSelected(position=0),需區分用戶操作與初始化parent.getCount() > 0 避免越界setText 避免閃爍private boolean isUserSelection = false;
spinner.setOnTouchListener((v, event) -> {
isUserSelection = true;
return false;
});
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
if (!isUserSelection) return; // 忽略初始化觸發
// 處理用戶選擇
isUserSelection = false;
}
// ...
});