第一頁(GridView)含 21 個項目(如城市:北京、上海、廣州…),點擊任一項目跳轉至第二頁(通用詳情頁)。第二頁有三個按鈕(地圖、相片、筆記),需根據第一頁選擇的項目,導航至對應城市的地圖/相片/筆記頁面。
關鍵在於「第一頁選項 → 唯一標識 → 第二頁接收 → 按鈕點擊時攜帶標識啟動第三頁」。
public class CityItem {
public int id; // 唯一識別碼
public String name; // 顯示名稱
public String mapKey; // 地圖頁面所需參數
public String photoKey; // 相片頁面所需參數
public String noteKey; // 筆記頁面所需參數
}
gridView.setOnItemClickListener((parent, view, position, id) -> {
CityItem item = (CityItem) parent.getItemAtPosition(position);
Intent intent = new Intent(MainActivity.this, DetailActivity.class);
intent.putExtra("city_id", item.id);
intent.putExtra("city_name", item.name);
intent.putExtra("map_key", item.mapKey);
intent.putExtra("photo_key", item.photoKey);
intent.putExtra("note_key", item.noteKey);
startActivity(intent);
});
public class DetailActivity extends AppCompatActivity {
private String mMapKey, mPhotoKey, mNoteKey;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
// 接收參數
Intent intent = getIntent();
mMapKey = intent.getStringExtra("map_key");
mPhotoKey = intent.getStringExtra("photo_key");
mNoteKey = intent.getStringExtra("note_key");
String cityName = intent.getStringExtra("city_name");
// 更新標題等 UI
setTitle(cityName);
// 綁定按鈕點擊
findViewById(R.id.btn_map).setOnClickListener(v -> navigate(MapActivity.class, mMapKey));
findViewById(R.id.btn_photo).setOnClickListener(v -> navigate(PhotoActivity.class, mPhotoKey));
findViewById(R.id.btn_note).setOnClickListener(v -> navigate(NoteActivity.class, mNoteKey));
}
private void navigate(Class<?> target, String key) {
if (key == null) { Toast.makeText(this, "資料未就緒", Toast.LENGTH_SHORT).show(); return; }
Intent i = new Intent(this, target);
i.putExtra("key", key);
startActivity(i);
}
}
public class MapActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
String key = getIntent().getStringExtra("key");
// 根據 key 載入對應城市地圖...
}
}
CityItem 實作 Parcelable,單次 putExtra("city", item) 傳遞完整物件。ViewModel 中持有當前選中城市,各 Fragment/Activity 觀察同一資料源。intent-filter,支援從通知、網頁直接跳轉。❌ 在 DetailActivity 重新查詢資料庫導致效能差、邏輯分散。
✅ 由上游直接攜帶所有必要參數,下游純粹負責展示與轉發。
❌ 忘記處理 key 為 null 的防禦性程式碼。
✅ 統一在 navigate() 中判空並提示。
此模式清晰分離「選擇→參數傳遞→二級導航」三層職責,擴充新城市或新功能鍵時,只需補充資料模型與對應 Activity,無需修改核心邏輯。