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"
我试图将数据从父 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"