【问题标题】:FragmentPagerAdapter deprecated不推荐使用 FragmentPagerAdapter
【发布时间】:2019-11-08 17:05:48
【问题描述】:

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

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

我在课堂上得到了这些导入:

import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter

但是class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager){ 中的FragmentPagerAdapter 被划掉了。

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]
        }
    }

【问题讨论】:

    标签: android kotlin android-viewpager fragmentmanager fragmentpageradapter


    【解决方案1】:

    2021-06-14 更新:此时,ViewPager 本身已被弃用。从技术上讲,ViewPager 没有被弃用,但两个具体的PagerAdapter 实现——FragmentPagerAdapterFragmentStatePagerAdapter——被弃用了。理想情况下,切换到其他内容,例如 ViewPager2the pager composable in Accompanist

    替换:

    class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager)
    

    与:

    class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
    

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

    【讨论】:

    • 在构造函数 FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 中添加 @SuppressLint("WrongConstant") 后,为什么我需要这个?
    • @AsadMukhtar:我不知道,抱歉。您可以考虑提出一个单独的 Stack Overflow 问题,您可以在其中提供 minimal reproducible example 显示您正在尝试的内容以及您需要在哪里应用该注释。
    • 我在构造函数中遇到了同样的问题,我猜它应该得到一个 LifeCycle 参数。
    • 或者,如果ViewPager2 破坏了您的应用行为,您可以说@SuppressWarnings("deprecation"):D
    • @EpicPandaForce:同意,但最终谷歌将停止更新androidx.viewpager:viewpager。即使那样,您也可以在一段时间内使用上次发布的版本,然后在更新其他内容时某些传递依赖或某些东西会破坏构建。因此,我们不必在本周比赛和替换 ViewPager,但我会在未来一两年的某个时候推荐它。
    【解决方案2】:

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


    此类已弃用。

    切换到ViewPager2 并改用FragmentStateAdapter


    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    【解决方案4】:

    使用 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>
    
    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]
        }
    }
    

    下面是实例化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()
    
    

    【讨论】:

      【解决方案5】:

      似乎不仅没有行为的构造函数,而且 FragmentPagerAdapter 类(通过将 Fragments 保留在内存中可以消耗大量内存)和 FragmentStatePagerAdapter 都处于弃用阶段。 我想知道什么可以用来扩展抽象类PagerAdapter 以延长代码库的寿命。

      【讨论】:

        【解决方案6】:

        您可以使用FragmentStateAdapter(fragment)

        class YourViewPagerAdapter(fragment: Fragment, val mFragmentList: Array<String>, val viewPager: ViewPager2) :  FragmentStateAdapter(fragment){
        
            override fun getItemCount(): Int {
                return mFragmentList.size
            }
        
            override fun createFragment(position: Int): Fragment {
                when(position){
                    0 -> return YourFirstTabFragment()
                    1 -> return YourSecondTabFragment()
                    2 -> return YourThirdTabFragment()
        
                }
                return YourFirstTabFragment()
            }
        
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-22
          • 2012-11-14
          • 2019-11-08
          • 2020-01-03
          • 2011-12-02
          • 2015-01-24
          • 2020-06-08
          相关资源
          最近更新 更多