首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 新手常見誤區:為什麼不能在一個 Activity 直接獲取另一個 Activity 的控件引用?

     編輯:程式設計疑難解答

問題本質

初學者常嘗試在 `ActivityA` 中通過 `findViewById()` 或持有 `ActivityB` 實例來直接操作 `ActivityB` 的 UI 控件(`TextView`、`EditText` 等),結果導致 `NullPointerException` 或介面不更新。

根本原因

  1. 生命週期不重疊:`ActivityB` 可能尚未 `onCreate()`、已 `onDestroy()`,或處於後棧停止狀態,其視圖層級根本不存在或已被銷毀。
  2. 視圖屬於具體 Activity 實例:`setContentView()` 充氣的視圖樹繫結於該 Activity 的 `Window`,非全域共享。
  3. 記憶體洩漏風險:長期持有另一 Activity 引用會阻礙 GC 回收,導致 OOM。

正確的跨 Activity 數據傳遞與交互模式

1. Intent + Bundle(標準單向傳遞)

// A → B
Intent intent = new Intent(A.this, B.class);
intent.putExtra("key", value);
startActivity(intent);

// B 取值
String val = getIntent().getStringExtra("key");

2. startActivityForResult / Activity Result API(雙向回傳)

// A 啟動 B 並期待結果
ActivityResultLauncher<Intent> launcher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> { if (result.getResultCode() == RESULT_OK) { ... } }
);
launcher.launch(new Intent(A.this, B.class));

// B 返回結果
Intent data = new Intent();
data.putExtra("result", "ok");
setResult(RESULT_OK, data);
finish();

3. 共享 ViewModel(Jetpack 推薦,生命週期感知)

// 共享 ViewModel(以 Application 或 Activity 為作用域)
public class SharedViewModel extends ViewModel {
    MutableLiveData<String> data = new MutableLiveData<>();
}

// A、B 皆通過 ViewModelProvider 獲取同一實例
SharedViewModel vm = new ViewModelProvider(this).get(SharedViewModel.class);
vm.data.observe(this, s -> { /* 更新 UI */ });
vm.data.setValue("new value");

4. 本地持久化 + 觀察者(跨進程/長期保存)

  • Room Database、DataStore、SharedPreferences 配合 LiveData/Flow 觀察變化。

5. EventBus / RxJava / Flow(解耦事件總線)

適用於多組件鬆耦合通訊,注意生命週期註冊/解註冊。

絕對避免的反模式

  • `public static TextView tv;` 在 Activity 中暴露控件 → 記憶體洩漏、空指針、並發問題。
  • 傳遞 `Activity` Context 給長生命週期物件(單例、靜態欄位、執行緒)。
  • 嘗試 `((B)getActivity()).textView.setText(...)` 在 Fragment 中強轉宿主 Activity 操作控件。

總結

Activity 之間不共享視圖,只共享數據。 透過 Intent、ViewModel、資料庫、事件總線等機制傳遞「數據」,各自在自己的生命週期內根據數據更新「各自的視圖」,才是 Android 架構設計的正確哲學。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved