App 啟動崩潰,Logcat 提示:
java.lang.RuntimeException: Unable to start activity ComponentInfo{...}:
java.lang.NullPointerException: Attempt to invoke virtual method
'void android.widget.Button.setOnClickListener(...)' on a null object reference
findViewById(R.id.button1) 回傳 null,原因通常是:
activity_main.xml 但按鈕在 fragment_main.xml)。res/layout/activity_main.xml,確認 <Button android:id="@+id/button1" /> 存在。setContentView(R.layout.activity_main) 與 layout 檔名一致。onViewCreated 或 onCreateView 內,並用 view.findViewById(...)。啟用 viewBinding true 後,編譯器產生型別安全的綁定類,編譯期即可發現找不到 View 的錯誤,徹底杜絕 NullPointerException。
// build.gradle
android {
viewBinding {
enabled = true
}
}
// Activity
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.button1.setOnClickListener(v -> { ... }); // 型別安全,不會為 null
}
90% 的 Unable to start activity + NullPointerException on Button 都是「Layout 與 Java 程式碼的 ID 不對應」。善用 ViewBinding 可從根源消除此類低級錯誤。