// Activity A 中嘗試操作 Activity B 的 Button
Button btn = (Button) findViewById(R.id.buttonGet); // 此時 setContentView 尚未執行或非當前 Activity 佈局
btn.setEnabled(false); // NullPointerException
findViewById **只能在當前 Activity 的視圖層級中查找**,且必須在 setContentView(layoutRes) **之後**呼叫。跨 Activity 直接操作 View 違反封裝原則且技術上不可行。
// Activity A
Intent intent = new Intent(ActivityA.this, ActivityB.class);
intent.putExtra("button_enabled", false); // 傳遞狀態
startActivity(intent);
// ActivityB
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b); // 先充氣佈局
Button btn = findViewById(R.id.buttonGet); // 再查找 View
boolean enabled = getIntent().getBooleanExtra("button_enabled", true);
btn.setEnabled(enabled);
}
// SharedViewModel.java
public class SharedViewModel extends ViewModel {
private final MutableLiveData buttonEnabled = new MutableLiveData<>(true);
public LiveData getButtonEnabled() { return buttonEnabled; }
public void setButtonEnabled(boolean enabled) { buttonEnabled.setValue(enabled); }
}
// Activity A
SharedViewModel vm = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())).get(SharedViewModel.class);
vm.setButtonEnabled(false);
// Activity B
SharedViewModel vm = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())).get(SharedViewModel.class);
vm.getButtonEnabled().observe(this, enabled -> buttonGet.setEnabled(enabled));
遵循「資料驅動視圖」原則,跨 Activity 互動即清晰且健壯。