代碼在 viewPager.setOnPageChangeListener(this) 處拋出 NullPointerException,原因極其簡單:未調用 findViewById 將 XML 佈局中的 ViewPager 綁定到變量。
private ViewPager viewPager; // 仅声明,未初始化
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_guide);
initView();
}
public void initView() {
views.add(getLayoutInflater().inflate(R.layout.layout_pre1, null));
views.add(getLayoutInflater().inflate(R.layout.layout_pre2, null));
// ❌ 此处 viewPager 仍为 null!
viewPager.setOnPageChangeListener(this);
viewPager.setAdapter(new MyPageAdapter());
}
public void initView() {
// ✅ 必须先绑定 XML 中的控件
viewPager = (ViewPager) findViewById(R.id.viewPager); // R.id.viewPager 对应 XML 中 android:id="@+id/viewPager"
views.add(getLayoutInflater().inflate(R.layout.layout_pre1, null));
views.add(getLayoutInflater().inflate(R.layout.layout_pre2, null));
viewPager.setOnPageChangeListener(this);
viewPager.setAdapter(new MyPageAdapter());
}
<!-- activity_guide.xml -->
<android.support.v4.view.ViewPager
android:id="@+id/viewPager" <!-- 此 id 必须与 findViewById 参数一致 -->
android:layout_width="match_parent"
android:layout_height="match_parent" />
setContentView() 後初始化findViewById 參數必須與 XML android:id 完全一致
// build.gradle
android {
viewBinding {
enabled = true
}
}
// Activity 中
private ActivityGuideBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityGuideBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
// 直接使用 binding.viewPager,無需 findViewById,編譯期檢查類型安全
binding.viewPager.setAdapter(new MyPageAdapter());
}
養成「聲明即綁定」的習慣,或遷移至 ViewBinding,能從根源杜絕空指針異常。