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

Android 從其他 Activity 操作 Button 報 NullPointerException?必須先 setContentView 再 findViewById

     編輯:程式設計綜合問答

錯誤場景


// Activity A 中嘗試操作 Activity B 的 Button
Button btn = (Button) findViewById(R.id.buttonGet); // 此時 setContentView 尚未執行或非當前 Activity 佈局
btn.setEnabled(false); // NullPointerException

根本原因

findViewById **只能在當前 Activity 的視圖層級中查找**,且必須在 setContentView(layoutRes) **之後**呼叫。跨 Activity 直接操作 View 違反封裝原則且技術上不可行。

正確模式:Intent 傳遞狀態,目標 Activity 自行處理

1. 傳遞參數啟動目標 Activity


// Activity A
Intent intent = new Intent(ActivityA.this, ActivityB.class);
intent.putExtra("button_enabled", false); // 傳遞狀態
startActivity(intent);

2. 目標 Activity 在 onCreate 讀取並套用


// 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);
}

進階:共享 ViewModel(同進程多 Activity 狀態同步)


// 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));

關鍵原則

  1. Activity 之間不直接操作彼此 View,違反生命週期與封裝。
  2. 資料向下傳遞:Intent Extra、SharedViewModel、Database、SharedPreferences。
  3. 目標 Activity 在 onCreate/setContentView 後根據資料初始化自身 View。

遵循「資料驅動視圖」原則,跨 Activity 互動即清晰且健壯。

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