简体   繁体   English

Viewpager2 Android:视图上的“下一步”按钮会在右侧生成两张幻灯片

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM