首页 > 解决方案 > NullPointerException 在使用片段内的片段创建视图 Kotlin

问题描述

当我启动包含带有 TabLayout 的 NavigationDrawer 的活动时,它会出现一个错误报告,指出 viewPager 不能为空。这是发生错误的代码,在 viewPager.adapter = adapter ...

希望有人能告诉我如何解决这个问题。

我在想我需要一种创建这些片段的方法

class fragment_nav_home : Fragment() {

    private fun setUpTabs() {
        val adapter = ViewPagerAdapter(childFragmentManager)

        adapter.addFragment(fragment_tab_artists(), "Artists")
        adapter.addFragment(fragment_tab_agencies(), "Agencies")

        viewPager.adapter = adapter

        tabs.setupWithViewPager(viewPager)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setUpTabs()
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        // setUpTabs()
        return inflater.inflate(R.layout.fragment_nav_home, container, false)
    }
}

函数 addFragment 来自下一个 Kotlin 类

class ViewPagerAdapter(supportFragmentManager: FragmentManager) :
    FragmentPagerAdapter(supportFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
    private val lstFragments = ArrayList<Fragment>();
    private val lstFragmentsTitles = ArrayList<String>();

    override fun getCount(): Int {
        return lstFragments.size
    }

    override fun getItem(i: Int): Fragment {
        return lstFragments[i]
    }

    override fun getPageTitle(i: Int): CharSequence? {
        return lstFragmentsTitles[i]
    }

    fun addFragment(fragment: Fragment, title: String) {

        lstFragments.add(fragment)
        lstFragmentsTitles.add(title)
    }
}

标签: androidkotlinfragmentadapter

解决方案


你的viewPager变量是空的,所以你不能adapter在它上面设置一个属性,因为null没有那个。

你在哪里设置viewPager?看起来您没有使用视图绑定库,因此您需要执行 aviewPager = findViewById(R.id.viewPager)或其他操作,例如onCreateView

val view = inflater.inflate(R.layout.fragment_nav_home, container, false)
viewPager = view.findViewById(R.id.viewPager)
return view

或者如果您使用的是 Kotlin 合成(其中布局中的 ID 被转换为具有相同名称的变量,因此您可以直接访问视图而无需查找它们):

import kotlinx.android.synthetic.main.fragment_nav_home.*

在这种情况下ViewPager,您的 XML 布局中需要一个 ID 为“viewPager”。

现在它为空,因为您尚未分配它,或者它不存在(如果它被自动分配)


推荐阅读