在 OnItemSelectedListener 等匿名內部類中,this 指向監聽器實例而非 Activity,導致 Toast.makeText(this, ...) 編譯錯誤。需根據場景選擇正確 Context。
| Context 類型 | 獲取方式 | 生命周期 | 適用場景 |
|---|---|---|---|
| Activity Context | this / ActivityName.this | 隨 Activity 銷毀 | UI 相關:Dialog、Toast、啟動 Activity、佈局 inflate |
| Application Context | getApplicationContext() | 全進程存活 | 非 UI 長期持有:Singleton、Service、資源訪問、文件路徑 |
| Base Context | getBaseContext() | 同 Activity | 極少直接使用,內部包裝層 |
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int pos, long id) {
// ❌ this 指向 OnItemSelectedListener 實例
// ✅ 使用外部類 this
Toast.makeText(MainActivity.this, "SELECTED", Toast.LENGTH_SHORT).show();
// ✅ 或 Application Context(Toast 兩者均可)
Toast.makeText(getApplicationContext(), "SELECTED", Toast.LENGTH_SHORT).show();
}
...
});
getApplicationContext() 統一。理解 Context 生命周期與作用域,告別空指針與內存洩漏。