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
相关产品推荐
相关产品推荐

