ViewPager + Fragment + RadioButton はホームページでよく使用されます。または詳細ページのタブ切り替え。発生頻度は非常に高いです。グーはそれを記録します。いつか忘れてしまいました。ちょっと見てください。良い記憶力は悪いペンほど良くはありません。
アダプターの作成
class MineAdapter(
fm: FragmentManager,
) : FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
override fun getCount(): Int {
return 3 //此处返回的数量为页数总和(从1开始)
}
override fun getItem(position: Int): Fragment {
return when (position) {
TYPE_1 -> 1Fragment.newInstance()
TYPE_2 -> 2Fragment.newInstance()
TYPE_3 -> 3Fragment.newInstance()
else -> throw IllegalArgumentException("无效参数 $position")
}
}
override fun getItemPosition(any: Any): Int {
return when (any) {
is 1Fragment -> TYPE_1
is 1Fragment -> TYPE_2
is 1Fragment -> TYPE_3
else -> super.getItemPosition(any)
}
}
companion object {
const val TYPE_1 = 0
const val TYPE_2 = 1
const val TYPE_3 = 2
}
}
アクティビティでの使用
binding.viewPager.adapter = adapter
binding.viewPager.offscreenPageLimit = adapter.count
//如果需要viewPager和radioGroup联动。则需添加如下
val bottomTabs = arrayOf(R.id.tab1, R.id.tab2, R.id.tab3 )
binding.radioGroup.setOnCheckedChangeListener {
_, i ->
when (i) {
bottomTabs[0] -> {
binding.viewPager.currentItem = TYPE_1
}
bottomTabs[1] -> {
binding.viewPager.currentItem = TYPE_2
}
bottomTabs[2] -> {
binding.viewPager.currentItem = TYPE_3
}
}
}
// 给viewPager设置变化选中页时更新button的监听器
binding.viewPager.addOnPageChangeListener(
ViewPagerRadioGroupIndicatorListener(
binding.rgTab
)
)
ViewPagerRadioGroupIndicatorListener は次のとおりです。
/**
* 用于当viewPager页面切换时更新radioButtons选中状态的监听器
*FO
* @author lxx
*/
class ViewPagerRadioGroupIndicatorListener(
private val viewGroup: RadioGroup
) : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {
// noop
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
// noop
}
override fun onPageSelected(position: Int) {
viewGroup.forEachIndexed {
index, button ->
if (button is RadioButton) {
val bt = button as RadioButton
bt.isChecked = index == position
}
}
}
}
これまでのところ。いたるところ。