FragmentPagerAdapter deprecated
Solution 1
UPDATE 2021-06-14: At this point, ViewPager
itself is all but deprecated. Technically, ViewPager
is not deprecated, but the two concrete PagerAdapter
implementations — FragmentPagerAdapter
and FragmentStatePagerAdapter
— are deprecated. Ideally, switch to something else, such as ViewPager2
or the pager composable in Accompanist.
Replace:
class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager)
with:
class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
(assuming that MyViewPagerAdapter
does not need this value to be configurable)
Solution 2
The javadocs actually has the following deprecation notice on FragmentPagerAdapter
:
This class is deprecated.
Switch to ViewPager2 and use FragmentStateAdapter instead.
Solution 3
Switch to ViewPager2 with FragmentStateAdapter.
Here is the XML view:-
<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]
}
}
Here is the way to instantiate 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()
Solution 4
Need to switch to ViewPager2, they have a migration guide here.
https://developer.android.com/training/animation/vp2-migration#java
Solution 5
It seems like not only the constructor without behavior, but the class FragmentPagerAdapter
(which can consume a good amount of memory by keeping Fragments in memory), and FragmentStatePagerAdapter
are both in deprecation stage.
I wonder what can be used to extend abstract class PagerAdapter
to extend codebase lifespan.
wbk727
Apparently, this user prefers to keep an air of mystery about them.
Updated on July 08, 2022Comments
-
wbk727 almost 2 years
Since API 27
FragmentPagerAdapter
is deprecated. What's the best alternative to use for this?In my case, I understand something like
super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
would need to be used, but I don't know where within my code this needs to go.I got these imports in my class:
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter
but
FragmentPagerAdapter
inclass MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager){
is crossed out.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] } }
-
Asad Mukhtar over 4 yearsWhy i need this after add this @SuppressLint("WrongConstant") after adding this in constructor FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT?
-
CommonsWare over 4 years@AsadMukhtar: I do not know, sorry. You might consider asking a separate Stack Overflow question, where you can provide a minimal reproducible example showing what you are trying and where you needed to apply that annotation.
-
Neoh about 4 yearsThis solution does not work if you want to extend ViewPager because
ViewPager2
ispublic final
. -
Everett about 4 yearsI get the same problem with the constructor, it's supposed to get a LifeCycle parameter I guess.
-
sta about 3 yearsHenrik Bøgelund Lavstsen, a link to a solution is welcome, but please ensure your answer is useful without it: add context around the link so your fellow users will have some idea what it is and why it is there, then quote the most relevant part of the page you are linking to in case the target page is unavailable. Answers that are little more than a link may be deleted.
-
Feroz Khan about 3 yearsWe cannot use FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT anymore as FragmentPagerAdapter is also deprecated now.
-
CommonsWare about 3 years@FerozKhan: Yes, I believe that at this point
ViewPager
itself is deprecated. -
EpicPandaForce about 3 yearsAlternately, you can say
@SuppressWarnings("deprecation")
in cases whereViewPager2
breaks your app behaviors :D -
CommonsWare about 3 years@EpicPandaForce: Agreed, though eventually Google is going to stop updating
androidx.viewpager:viewpager
. Even then, you might be able to use the last-shipped version for a while, before some transitive dependency or something breaks the build as you update other stuff. So, we don't have to race and replaceViewPager
this week, but I would recommend it sometime in the next year or two. -
Pemba Tamang almost 3 yearshow do I work this out github.com/android/views-widgets-samples/issues/107
-
Bhavin Solanki about 2 yearsStill deprecated with the same solutions.