You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android启动含ViewPager2的Activity时setAdapter空指针如何解决

问题原因

抛出空指针的核心原因是ProfileActivity的onCreate生命周期方法代码执行顺序错误:
你在没有调用setContentView()给Activity加载布局文件的前提下,提前调用findViewById()查找ViewPager2控件,此时Activity没有关联任何视图,findViewById直接返回null,后续对这个null对象调用setAdapter()方法就触发了日志里的空指针异常。
除此之外你的MyAdapter目前只有空的Fragment列表,没有添加对应3个标签页的Fragment实例,就算解决空指针问题,后续滑动ViewPager2也会触发数组越界崩溃。

修复方案

1. 修正onCreate方法的执行顺序

必须先完成布局加载,再操作布局内的控件,修正后的代码如下:

private val tabTitle = arrayOf("Perfil", "Actividades", "Membresia")
private lateinit var pagerAdapter: MyAdapter

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 第一优先级:先加载布局并设置给Activity,这步必须在所有控件操作之前
    binding = ActivityProfileBinding.inflate(layoutInflater)
    setContentView(binding.root)

    // 布局加载完成后再初始化控件,使用ViewBinding无需调用findViewById
    val pager = binding.viewPager2
    val tabLayout = binding.profileLayout

    // 初始化适配器,添加对应3个标签的Fragment实例,替换成你自己实现的Fragment类
    pagerAdapter = MyAdapter(supportFragmentManager, lifecycle)
    pagerAdapter.addFragment(PerfilFragment())
    pagerAdapter.addFragment(ActividadesFragment())
    pagerAdapter.addFragment(MembresiaFragment())

    // 给ViewPager2设置适配器
    pager.adapter = pagerAdapter

    // 关联TabLayout和ViewPager2
    TabLayoutMediator(tabLayout, pager) { tab, position ->
        tab.text = tabTitle[position]
    }.attach()
}

如果你没有启用ViewBinding,使用findViewById的话,也必须先调用setContentView(R.layout.activity_profile),再执行查找控件的逻辑。

2. 其他配套检查项

  • 检查AndroidManifest.xml中是否将VolleySingleton配置为全局Application类:在<application>标签下添加属性android:name=".VolleySingleton",否则Volley单例的instance始终为null,网络请求无法正常发起。
  • 测试时确保手机和运行后端服务的电脑处于同一局域网,Android 9及以上版本需要额外配置网络安全规则允许HTTP明文请求,否则本地接口会被系统拦截无法访问。

内容的提问来源于stack exchange,提问作者scorpions78

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:33:16