android-fragments 检视分页器2:仅在片段可见时初始化片段,然后保持其初始化状态

aiqt4smr  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(160)

我使用ViewPager2管理了4个片段。
我希望仅在第一次打开时初始化每个片段,也就是说,当我打开应用程序时,只有第一个片段得到初始化,而第二个片段只有在我导航到它时才会初始化。
当我没有做任何特殊配置时,这似乎是viewpager2的默认行为。
但我想做的是在导航到第二个片段时不丢失第一个片段的示例。
我尝试使用viewpager。isUserInputEnabled = 4(或1)。此函数保持片段初始化,且不会丢失它们示例。但它会一次初始化所有片段,而且我只想在它们可见时初始化它们。
这是我的适配器

class HomeAdapter(fragmentActivity : FragmentActivity) : FragmentStateAdapter(fragmentActivity)
{
    override fun getItemCount() : Int = 4
    
    
    override fun createFragment(position : Int) : Fragment
    {
        return when(position)
        {
            0 -> SearchMissionContainerFragment.instance()
            1 -> MissionHistoryFragment.instance()
            2 -> PaymentContainerView.instance()
            else -> SettingsFragment.instance()
        }
    }
}

这是初始化部分

binding.viewpager.offscreenPageLimit = 1
binding.viewpager.isUserInputEnabled = false
binding.viewpager.adapter = HomeAdapter(this)

有什么办法吗?

wnavrhmk

wnavrhmk1#

我找不到解决这个问题的方法,但是无论如何,你对这个行为有什么问题?如果你需要一个回调,当片段是可见的,你可以使用onResume回调。如果你想onResume代码不调用两次,你可以在onResume的末尾设置一个变量(布尔值)为true,并在onResume的第一行检查它的值。

mklgxw1f

mklgxw1f2#

你可以试试这个link
设置offscreenPageLimit = size,片段将扩展LazyFragment
实现覆盖getContentViewId()返回R.layout.your_layout这将首次初始化布局,但不初始化视图。
重写initView()initData()initEvent(),并将您代码放在这些方法中。

abstract class LazyFragment : Fragment() {

    private var mContext: Context? = null
    private var isFirstLoad = true // Whether to load for the first time

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mContext = activity
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = LayoutInflater.from(mContext).inflate(getContentViewId(), null)
        initView(view)
        return view
    }

    override fun onResume() {
        super.onResume()
        if (isFirstLoad) {
        // Put the data loading logic in the onResume() method
            initData()
            initEvent()
            isFirstLoad = false
        }
    }

/**
 * Set layout resource id
 *
 * @return
 */
    protected abstract fun getContentViewId(): Int

/**
 * Initialize the view
 *
 * @param view
 */
    protected fun initView(view: View?) {}

/**
 * Initialization data
 */
    protected fun initData() {}

/**
 * Initialization event
 */
    protected fun initEvent() {}
}

相关问题