簡體   English   中英

Viewpager2 Android:視圖上的“下一步”按鈕會在右側生成兩張幻燈片

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM