Kotlin ViewPager 空指针异常
Posted
技术标签:
【中文标题】Kotlin ViewPager 空指针异常【英文标题】:Kotlin ViewPager Null PointerException 【发布时间】:2020-03-07 13:20:17 【问题描述】:我正在尝试在已经存在的片段中获取viewpager
。
在另一个项目中,viewpager
在 activity_main.xml 中时我没有任何问题
我尝试过的事情之一如下:
ViewPagerAdapter.kt
class ViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
override fun getItem(position: Int): Fragment
return when (position)
0 -> KapperKeuze1Fragment()
1 -> KapperKeuze2Fragment()
else -> KapperKeuze3Fragment()
override fun getCount(): Int
return 3
MainActivity.kt
class MainActivity : AppCompatActivity()
lateinit var homeFragment: HomeFragment
lateinit var afspraakFragment: AfspraakFragment
lateinit var overFragment: OverFragment
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val bottomNavigation : BottomNavigationView = findViewById(R.id.bot_nav)
homeFragment = HomeFragment()
supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, homeFragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit()
bottomNavigation.setOnNavigationItemSelectedListener item ->
when (item.itemId)
R.id.home ->
homeFragment = HomeFragment()
supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, homeFragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit()
R.id.afspraak ->
afspraakFragment = AfspraakFragment()
supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, afspraakFragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit()
R.id.over ->
overFragment = OverFragment()
supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, overFragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit()
true
val adapter = ViewPagerAdapter(supportFragmentManager)
val pager = findViewById<View>(R.id.viewPager) as ViewPager
pager.adapter = adapter
fragment_afspraak.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical">
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_
android:layout_/>
</LinearLayout>
错误发生在 MainActivity.kt 中:val pager = findViewById<View>(R.id.viewPager) as ViewPager
并给出:
原因:kotlin.TypeCastException: null 不能转换为非空类型androidx.viewpager.widget.ViewPager
【问题讨论】:
R.id.viewPager
不在您尚未发布的R.layout.activity_main
中
@tyczj 我希望 viewpager 位于已经存在的片段中,当我将 viewpager 放在 main 中时不会发生。那么我怎样才能把它放在另一个布局中呢?
你为什么不在你的片段中实现你的viewPager???!!您可以在片段的 onCreateView 或 onViewCreated 方法中简单地实现 ViewPager
@AlirezaBideli 这就是我想要的,但我已经在谷歌上搜索了几个小时来了解如何做到这一点,我是 kotlin 和 android 开发的新手。这将如何运作?
【参考方案1】:
使用 childFragmentManager 而不是 supportFragmentManager
因为它返回一个私有 FragmentManager 用于放置和管理此 Fragment 内部的 Fragment。(您 ViewPager 片段位于您的 afspraak 片段中)
所以在你的 AfspraakFragment 中设置你的 ViewPager 如下:
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
super.onViewCreated(view, savedInstanceState)
val adapter = ViewPagerAdapter(childFragmentManager)
val pager = view.findViewById(R.id.viewPager) as ViewPager
pager.adapter = adapter
【讨论】:
以上是关于Kotlin ViewPager 空指针异常的主要内容,如果未能解决你的问题,请参考以下文章