【问题标题】:findFragmentByTag keeps returning Null in Android using ViewPagerfindFragmentByTag 使用 ViewPager 在 Android 中不断返回 Null
【发布时间】:2021-11-03 04:25:18
【问题描述】:

我试图将数据从父活动传递到 viewPager,我找到了使用 findFragmentByTag 的解决方案,但它返回 Null,我不确定我错过了什么。

我发现example 使用了已弃用的FragmentPagerAdapter,我想这可能是我的实现不起作用的原因,所以我正在寻找前进的道路。

(supportFragmentManager.findFragmentByTag(tag) as StopwatchFragment?)?.displayData(
            min!!,
            sec!!,
            millis!!
        )

为空

主要活动

class MainActivity : AppCompatActivity(), StopwatchListener {
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
       ...
        binding.viewPagerMain.adapter = PageAdapter(supportFragmentManager, lifecycle)
       
    }
...
 override fun getTheTime(min: String?, sec: String?, millis: String?) {
        val tag =
            "android:switcher:" + R.id.view_pager_main.toString() + ":" + binding.viewPagerMain.currentItem
        Log.d("Main", tag)
        (supportFragmentManager.findFragmentByTag(tag) as StopwatchFragment?)?.displayData(
            min!!,
            sec!!,
            millis!!
        )
    }
}

页面适配器

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

    override fun getItemCount() = 3

    override fun createFragment(position: Int): Fragment {
        return when (position) {
            0 -> {
                RepsFragment()
            }
            1 -> {
                StopwatchFragment()
            }
            2 -> {
                TimerFragment()
            }
            else -> {
                RepsFragment()
            }
        }
    }
}

【问题讨论】:

    标签: android kotlin android-viewpager2 fragmentstateadapter


    【解决方案1】:
    val tag =
            "android:switcher:" + R.id.view_pager_main.toString() + ":" + binding.viewPagerMain.currentItem
    

    这适用于ViewPager 而不是ViewPager2

    要为ViewPager2 执行此操作,您需要:

    val tag = "f$pageId"
    

    这要求页面具有唯一的 ID,为简单起见,您可以将它们设置为 ViewPager 位置;这样做覆盖适配器的getItemId()

    class PageAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) :
        FragmentStateAdapter(fragmentManager, lifecycle) {
    
        // ... 
    
        override fun getItemId(position: Int): Long {
            return position.toLong()
        }
    }
    

    然后pageId 将是当前页面(或您想要的任何页面位置),因此标签将是:

    val tag = "f$binding.viewPagerMain.currentItem"
    

    【讨论】:

    • 错误发生了变化,现在专门说null cannot be cast to non-null type com.homeofficeprojects.countmyrepstoo.StopwatchFragment。所以supportFragmentManager 仍然没有找到片段
    • 这是在(supportFragmentManager.findFragmentByTag(tag) as StopwatchFragment?) 提出的吗?
    • 不,我使用的代码删除了空检查,因为数据没有传输,我想看看断开连接的位置 val tag = "f${binding.viewPagerMain.currentItem}" val f = supportFragmentManager.findFragmentByTag(tag) as StopwatchFragment }
    • 如果您在将适配器附加到 ViewPager 片段之前尝试访问它,则可能会发生这种情况;或者当当前屏幕上不存在 ViewPager 时
    • 似乎无论我在哪里调用函数,它似乎都找不到片段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2017-12-22
    • 2018-07-14
    • 1970-01-01
    相关资源
    最近更新 更多