FragmentPagerAdapter 已弃用
FragmentPagerAdapter deprecated
因为 API 27 FragmentPagerAdapter
已弃用。最好的替代方法是什么?
就我而言,我知道需要使用 super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
之类的东西,但我不知道我的代码中需要去哪里。
我在 class:
中得到了这些导入
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]
}
}
更新 2021-06-14:此时,ViewPager
本身几乎已被弃用。从技术上讲,ViewPager
没有被弃用,但是两个具体的 PagerAdapter
实现——FragmentPagerAdapter
和 FragmentStatePagerAdapter
——被弃用了。理想情况下,切换到其他内容,例如 ViewPager2
或 the pager composable in Accompanist.
替换:
class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager)
与:
class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
(假设MyViewPagerAdapter
不需要这个值可配置)
javadocs 实际上在 FragmentPagerAdapter
上有以下弃用通知:
此 class 已弃用。
改为 ViewPager2 and use FragmentStateAdapter。
似乎不仅构造函数没有行为,而且 class FragmentPagerAdapter
(通过在内存中保留 Fragments 可以消耗大量内存)和 FragmentStatePagerAdapter
都是都处于弃用阶段。
我想知道什么可以用来扩展抽象 class PagerAdapter
来延长代码库的生命周期。
需要切换到 ViewPager2,这里有迁移指南。
https://developer.android.com/training/animation/vp2-migration#java
您可以使用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()
}
}
切换到带有 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()
因为 API 27 FragmentPagerAdapter
已弃用。最好的替代方法是什么?
就我而言,我知道需要使用 super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
之类的东西,但我不知道我的代码中需要去哪里。
我在 class:
中得到了这些导入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]
}
}
更新 2021-06-14:此时,ViewPager
本身几乎已被弃用。从技术上讲,ViewPager
没有被弃用,但是两个具体的 PagerAdapter
实现——FragmentPagerAdapter
和 FragmentStatePagerAdapter
——被弃用了。理想情况下,切换到其他内容,例如 ViewPager2
或 the pager composable in Accompanist.
替换:
class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager)
与:
class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
(假设MyViewPagerAdapter
不需要这个值可配置)
javadocs 实际上在 FragmentPagerAdapter
上有以下弃用通知:
此 class 已弃用。
改为 ViewPager2 and use FragmentStateAdapter。
似乎不仅构造函数没有行为,而且 class FragmentPagerAdapter
(通过在内存中保留 Fragments 可以消耗大量内存)和 FragmentStatePagerAdapter
都是都处于弃用阶段。
我想知道什么可以用来扩展抽象 class PagerAdapter
来延长代码库的生命周期。
需要切换到 ViewPager2,这里有迁移指南。
https://developer.android.com/training/animation/vp2-migration#java
您可以使用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()
}
}
切换到带有 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()