我有以下代码(借用了向日葵app):
const val FRAGMENT_A_PAGE_INDEX = 0
const val FRAGMENT_B_PAGE_INDEX = 1
class ViewPagerAdapter(fragment: Fragment): FragmentStateAdapter(fragment) {
/**
* Mapping of the ViewPager page indexes to their respective Fragments
* */
private val tabFragmentsCreators: Map<Int, () -> Fragment> = mapOf(
FRAGMENT_A_PAGE_INDEX to { FragmentA() },
FRAGMENT_B_PAGE_INDEX to { FragmentB() }
)
override fun getItemCount(): Int = tabFragmentsCreators.size
override fun createFragment(position: Int): Fragment =
tabFragmentsCreators[position]?.invoke() ?: throw IndexOutOfBoundsException()
}
因此,在上面托管viewpager的host fragment controller中,我有以下内容:
class ViewPagerControllerFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = FragmentViewPagerControllerBinding.inflate(inflater, container, false)
// set the adapter of the ViewPager2 widget
binding.viewpager.adapter = ViewPagerAdapter(this)
binding.lifecycleOwner = viewLifecycleOwner
// inflate the layout for this fragment
return binding.root
}
... // NOT RELEVANT PARTS ARE SKIPPED ...
}
在调试会话期间,我看到FragmentA
和FragmentB
的OnCreateView()
方法只被调用/调用一次。 因此,当第一次访问fragmenta
时,系统调用它的onCreateView()
方法。 当我滑动到fragmentB
,然后再次返回到fragmentA
时,不会调用OnCreateView()
。 为甚么会这样呢? 我怎样才能改变它,使它在我输入片段时被调用呢?
class FragmentA : Fragment() {
// gets called once
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { ... }
}
class FragmentB : Fragment() {
// gets called once
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { ... }
}
请尝试使用以下代码:
Java版本:
viewPager.addOnPageChangeListener(new OnPageChangeListener() {
public void onPageScrollStateChanged(int state) {}
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
public void onPageSelected(int position) {
// put your code here
}
});
Kotlin版本:-
viewPager.registerOnPageChangeCallback(object :
ViewPager2.OnPageChangeCallback() {
override fun onPageScrollStateChanged(state: Int) {
println(state)
}
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels)
println(position)
}
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
// put your code here
}
})
当您从一个片段滑动到下一个片段时,您的ViewPager2
OnPageChangeCallback
将执行,您可以从那里识别当前选择的片段。