場景:在 onCreate 中創建 Spinner,需在另一個類(如 Dialog 點擊監聽器)中調用 spinner.setSelection(0)。
public class MainActivity extends Activity {
private Spinner spinner; // 成員變量
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
spinner = findViewById(R.id.spinner1); // 賦值
// ...
}
// 內部類/匿名類直接訪問
private class MyClickListener implements DialogInterface.OnClickListener {
@Override public void onClick(DialogInterface dialog, int which) {
spinner.setSelection(0); // 直接用
}
}
}
// 外部類構造函數接收 Spinner
public class ExternalHandler {
private Spinner spinner;
public ExternalHandler(Spinner spinner) { this.spinner = spinner; }
public void handleClick() {
spinner.setSelection(0);
}
}
// Activity 中
ExternalHandler handler = new ExternalHandler(spinner);
// 或設置給 Dialog
dialog.setOnClickListener((d, w) -> handler.handleClick());
// 定義接口
interface SpinnerController {
void resetSelection();
}
// Activity 實現
public class MainActivity extends Activity implements SpinnerController {
@Override public void resetSelection() { spinner.setSelection(0); }
}
// 外部類持有接口引用
public class ExternalHandler {
private SpinnerController controller;
public ExternalHandler(SpinnerController c) { controller = c; }
public void onAction() { controller.resetSelection(); }
}
// 利用 Binding 的靜態 inflate 獲取根 View,再 findViewById
public static Spinner getSpinner(View root) {
return root.findViewById(R.id.spinner1);
}
// 外部類接收 root View
public void onClick(View dialogView) {
Spinner spinner = MainActivity.getSpinner(dialogView.getRootView());
spinner.setSelection(0);
}
| 場景 | 推薦 |
|---|---|
| 同一 Activity 內部類 | 方案一(成員變量) |
| 外部工具類、需單元測試 | 方案二/三(依賴注入/接口) |
| 跨 Fragment/Activity | ViewModel + LiveData 共享狀態 |
避免在外部類中重複 findViewById,選擇合適層級的引用傳遞,保持架構清晰。