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

Android ViewPager 空指針異常:未初始化 ViewPager 對象

     編輯:程式設計疑難解答

新手最易踩的 findViewById 遺漏坑

代碼在 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());
}

XML 佈局對應檢查


<!-- 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 完全一致
  • 使用 ButterKnife / ViewBinding / DataBinding 可消除此類樣板代碼錯誤

現代最佳實踐:ViewBinding(推薦)


// 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,能從根源杜絕空指針異常。

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