[英]Viewpager2 Android : A Next button on the view generates two slides to the right
I'm stuck on viewpager2 problem on Android.我被困在 Android 上的 viewpager2 问题上。 I have a viewpager2 creating some fragments depending on the position.
我有一个 viewpager2 根据 position 创建一些片段。 Each fragment has a next button to navigate horizontally in the view pager.
每个片段都有一个下一步按钮,用于在视图寻呼机中水平导航。
But when I asked for the next page from the button, I had the action of sliding twice.但是当我从按钮请求下一页时,我有滑动两次的动作。 It like the method createFragment from the adapter was called twice, due to the preload of the fragment borders...
由于片段边界的预加载,它就像来自适配器的方法 createFragment 被调用了两次......
Activity who manage the view pager:管理视图寻呼机的活动:
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
}
}
}
The FragmentStateAdapter片段状态适配器
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()
}
}
}
A fragment example:片段示例:
class ConfigureFragment(private val instance : ConfigurationActivity, private val configPosition: Int) : Fragment() {
...
view.button_continue.setOnClickListener {
nextPage(instance, configPosition+1)
}
...
}
Try like this way:-像这样尝试:-
First of all change viewPager
variable private
to public
in Activity like removing private
keyword.首先在 Activity
viewPager
变量private
更改为public
,例如删除private
关键字。
var viewPager: ViewPager2? = null
In fragment change setOnClickListener
method like below:在片段更改
setOnClickListener
方法中,如下所示:
view.button_continue.setOnClickListener { instance...viewPager!!.arrowScroll(View.FOCUS_RIGHT) }
*Suggestion: *建议:
In fragment, we can get parent activity instance and use this way instead of passing activity instance to each fragment.在片段中,我们可以获取父活动实例并使用这种方式,而不是将活动实例传递给每个片段。
val instance = ((activity as AppCompatActivity) as ConfigurationActivity)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.