FragmentPagerAdapter已弃用

Mac*_*ver 10 android android-viewpager kotlin fragmentpageradapter fragmentmanager

由于API 27 FragmentPagerAdapter已弃用。最好的替代方法是什么?

就我而言,我知道super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)需要使用类似的东西,但是我不知道代码需要放在哪里。

我在课堂上得到了这些进口:

import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
Run Code Online (Sandbox Code Playgroud)

FragmentPagerAdapterclass MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager){被划掉。

class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager){
        private val fragmentList : MutableList<androidx.fragment.app.Fragment> = ArrayList()
        private val titleList : MutableList<String> = ArrayList()

        override fun getItem(position: Int): androidx.fragment.app.Fragment {
            return fragmentList[position]
        }

        override fun getCount(): Int {
            return fragmentList.size
        }

        fun addFragment(fragment: androidx.fragment.app.Fragment, title: String){
            fragmentList.add(fragment)
            titleList.add(title)
        }

        override fun getPageTitle(position: Int): CharSequence? {
            return titleList[position]
        }
    }
Run Code Online (Sandbox Code Playgroud)

Com*_*are 25

更换:

class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager)
Run Code Online (Sandbox Code Playgroud)

与:

class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
Run Code Online (Sandbox Code Playgroud)

(假设MyViewPagerAdapter不需要此值是可配置的)

  • 为什么在构造函数 FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 中添加 @SuppressLint("WrongConstant") 之后我需要这个? (9认同)
  • 我们不能再使用 FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT,因为 FragmentPagerAdapter 现在也已弃用。 (2认同)

Bha*_*ani 16

使用 FragmentStateAdapter 切换到 ViewPager2。

这是 XML 视图:-

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
class AdapterTabPager(activity: FragmentActivity?) : FragmentStateAdapter(activity!!) {
    private val mFragmentList: MutableList<Fragment> = ArrayList()
    private val mFragmentTitleList: MutableList<String> = ArrayList()
    
    public fun getTabTitle(position : Int): String{
        return mFragmentTitleList[position]
    }

    fun addFragment(fragment: Fragment, title: String) {
        mFragmentList.add(fragment)
        mFragmentTitleList.add(title)
    }

    override fun getItemCount(): Int {
        return mFragmentList.size
    }

    override fun createFragment(position: Int): Fragment {
        return mFragmentList[position]
    }
}
Run Code Online (Sandbox Code Playgroud)

这是实例化 ViewPager 的方法:-

val adapter = AdapterTabPager(activity)
        adapter.addFragment(categoryFragment, "Category")
        adapter.addFragment(brandFragment, "Brand")

        rootView.viewpager.adapter = adapter
        rootView.viewpager.currentItem = 0
        TabLayoutMediator(rootView.tabs, rootView.viewpager) { tab, position ->
            tab.text = adapter.getTabTitle(position)
        }.attach()

Run Code Online (Sandbox Code Playgroud)


Kis*_*kae 9

javadocs 实际上有以下弃用通知FragmentPagerAdapter


该类已弃用。

切换到ViewPager2并改用FragmentStateAdapter


  • 如果您想扩展 ViewPager,则此解决方案不起作用,因为“ViewPager2”是“public final”。 (4认同)

Hen*_*sen 6

需要切换到ViewPager2,他们这里有迁移指南。

https://developer.android.com/training/animation/vp2-migration#java