findFragmentByTag 使用 ViewPager 在 Android 中不断返回 Null

findFragmentByTag keeps returning Null in Android using ViewPager

我试图将数据从父 Activity 传递到 viewPager,我找到了一个使用 findFragmentByTag 的解决方案,但它 returns 为空,我是不知道我错过了什么。

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

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

为空

主要Activity

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()
            }
        }
    }
}
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"