TabLayout Fragments 在 popBackStack 之后绑定了 NullPointerException(来自 fragment)

问题描述 投票:0回答:0

TI 在使用 ViewBinding 的单个 Activity 应用程序中的一些片段有问题,当我从片段 A(它有一个 ViewPager2 和 TabLayout 有 3 个片段)到另一个片段 B 然后回到片段 A(按下后退按钮) ).当我回到片段 A 时,如果我尝试使用在选项卡片段内创建的任何方法并从片段 A 中使用它们,它会在 FragmentTab1.getBinding 或选项卡中的任何片段上显示 NullPointerException。

上下文:

agregarMuestraFragment(片段 A)是一个带有 ViewPager2 和 TabLayout 的片段,用于在其中显示带有选项卡的 3 个片段,并连接(使用设置按钮)到名为 configuracionFragment(片段 B)

这是 ViewPagerAdapter


class ViewPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle):
    FragmentStateAdapter(fragmentManager, lifecycle) {

    var fragments = mutableListOf<Fragment>()

    override fun getItemCount(): Int {
        return fragments.size
    }

    override fun createFragment(position: Int): Fragment {
        return fragments[position]
    }

    public fun addFragment(fragment: Fragment){
        fragments.add(fragment)
    }
}

在 agregarMuestrasFragment 中,我正在以这种方式在 onViewCreated 中创建 viewpager 和选项卡布局。


viewPagerAdapter = ViewPagerAdapter(
    childFragmentManager,
    lifecycle
)

fragmentTaxonomia = FragmentTaxonomia()
fragmentColeccion = FragmentColeccion(this@AgregarMuestrasFragment::animarConfigIcon)
fragmentLugar = FragmentLugar()

viewPagerAdapter.addFragment(
    fragmentLugar
)
viewPagerAdapter.addFragment(
    fragmentColeccion
)
viewPagerAdapter.addFragment(
    fragmentTaxonomia
)

binding.viewPager2.adapter = viewPagerAdapter

TabLayoutMediator(
    binding.tabLayout,
    binding.viewPager2
) { tab, position ->
    when (position) {
        0 -> tab.text = "Lugar"
        1 -> tab.text = "Colección"
        2 -> tab.text = "Taxonomía"
    }
}.attach()

binding.tabLayout.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener {
    override fun onTabSelected(tab: TabLayout.Tab) {
        when(tab.position) {
            2 -> {
                binding.btnGeolocalizar.visibility = View.GONE
                binding.btnAgregarMuestra.isEnabled = true
            }
            1 -> {
                binding.btnGeolocalizar.visibility = View.GONE
                binding.btnAgregarMuestra.isEnabled = true
            }
            0 -> {
                binding.btnGeolocalizar.visibility = View.VISIBLE
                binding.btnAgregarMuestra.isEnabled = true
            }
        }
    }

    override fun onTabUnselected(tab: TabLayout.Tab?) {
    }

    override fun onTabReselected(tab: TabLayout.Tab?) {
    }
})

以这种方式初始化片段的原因是因为我需要它们的引用来使用它们内部定义的一些函数。当我按下 agregarMuestrasFragment 中的 Geolocalizar 按钮或 Agregar muestra 按钮时,这些功能会更改选项卡片段的 ui。


// listener in agregarMuestrasFragment

binding.btnGeolocalizar.setOnClickListener{
    fragmentLugar.startLoadingDepartamento()
    fragmentLugar.startLoadingMunicipio()
}

这是fragmentLugar

中的函数startLoadingDepartamento

// function defined in fragmentLugar, 
// which is a tab from agregarMuestrasFragment
// This functions is called from agregarMuestrasFragment

public fun startLoadingCoordenadasDepto(){
    binding.wraperLongitud.alpha = 0.3f
    binding.wraperLatitud.alpha = 0.3f
    binding.wraperAlturaMinima.alpha = 0.3f
    binding.progressBarLatitud.visibility = View.VISIBLE
    binding.progressBarLongitud.visibility = View.VISIBLE
    binding.progressBarAlturaMinima.visibility = View.VISIBLE
}

底部的灰色按钮(Agregar muestra)也发生了同样的情况。按下时,它会调用片段中的一些函数来更改它们的 UI。


// listener in agregarMuestrasFragment

binding.btnAgregarMuestra.setOnClickListener {
    fragmentColeccion.colectorPrincipalSetError()
    fragmentLugar.setErrorAlturaMinima()
    fragmentTaxonomia.caracteristricasIndividuoRemoveError()
}

如果我不去configurationFragment,这将完美运行。当我从 agregarMuestrasFragment 转到 configuracionFragment 然后返回到 agregarMuestrasFragment 时,如果我尝试按 Geolocalizar 按钮或 Agregar Muestra 按钮以使用选项卡片段内定义的功能,我在

处收到 NullPointerException

FragmentLugar.getBinding(FragmentLugar.kt:31)
//or 
FragmentTaxonomia.getBinding(FragmentTaxonomia.kt:22)

片段的那些行是我定义绑定变量的地方


private val binding get() = _binding!!

kotlin uinavigationcontroller android-tablayout android-viewpager2 android-viewbinding
© www.soinside.com 2019 - 2024. All rights reserved.