[英]Viewpager2 Android : A Next button on the view generates two slides to the right
我被困在 Android 上的 viewpager2 问题上。 我有一个 viewpager2 根据 position 创建一些片段。 每个片段都有一个下一步按钮,用于在视图寻呼机中水平导航。
但是当我从按钮请求下一页时,我有滑动两次的动作。 由于片段边界的预加载,它就像来自适配器的方法 createFragment 被调用了两次......
管理视图寻呼机的活动:
class ConfigurationActivity : AppCompatActivity() {
private var viewPager : ViewPager2? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_configuration)
viewPager = viewPager2
val instance = this
viewPager!!.apply {
isUserInputEnabled = true
orientation = ViewPager2.ORIENTATION_HORIZONTAL
if(viewPager!!.adapter == null)
viewPager!!.adapter = ConfigAdapter(supportFragmentManager, lifecycle, instance, 2)
}
viewPager!!.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
currentItem = position
}
})
}
companion object{
private var currentItem : Int = 0
fun nextPage(instance : ConfigurationActivity, currentPosition : Int?){
instance.viewPager!!.currentItem = currentItem + 1
}
}
}
片段状态适配器
class ConfigAdapter(fm: FragmentManager, lc : Lifecycle, private val instance : ConfigurationActivity, configSnapshot : ArrayList<Configuration>) : FragmentStateAdapter(fm, lc) {
private val configSize = configSnapshot.size
override fun getItemCount(): Int {
val length = configSize + 3
instance.pageIndicatorView.count = length
return length
}
override fun createFragment(position: Int): Fragment {
Timber.d("creating fragment at position $position")
return when(position){
0 -> WelcomeFragment(instance)
in 1..configSize /* position between 1 and configSize (included) */ -> ConfigureFragment(instance, position-1)
1 + configSize -> IdentifyFragment(instance)
2 + configSize -> EndFragment()
else -> Fragment()
}
}
}
片段示例:
class ConfigureFragment(private val instance : ConfigurationActivity, private val configPosition: Int) : Fragment() {
...
view.button_continue.setOnClickListener {
nextPage(instance, configPosition+1)
}
...
}
像这样尝试:-
首先在 Activity viewPager
变量private
更改为public
,例如删除private
关键字。
var viewPager: ViewPager2? = null
在片段更改setOnClickListener
方法中,如下所示:
view.button_continue.setOnClickListener { instance...viewPager!!.arrowScroll(View.FOCUS_RIGHT) }
*建议:
在片段中,我们可以获取父活动实例并使用这种方式,而不是将活动实例传递给每个片段。
val instance = ((activity as AppCompatActivity) as ConfigurationActivity)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.