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&lt;View&gt;(R.id.viewPager) as ViewPager

并给出:

原因:kotlin.TypeCastException: null 不能转换为非空类型androidx.viewpager.widget.ViewPager

【问题讨论】:

R.id.viewPager 不在您尚未发布的R.layout.activity_main @tyczj 我希望 viewpager 位于已经存在的片段中,当我将 viewpager 放在 main 中时不会发生。那么我怎样才能把它放在另一个布局中呢? 你为什么不在你的片段中实现你的viewPager???!!您可以在片段的 onCreateViewonViewCreated 方法中简单地实现 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 空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

给ViewPager设置adapter出现空指针异常 解决

默认值中的kotlin空指针异常

不可为空的抽象变量能否在 KOTLIN 中引发空指针异常?

Kotlin 中的非空值产生空指针异常

在使用ViewPager时尝试从其父活动修改片段时出现空指针异常

Spring 代理类和 Kotlin 中的空指针异常