Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 具有3个以上选项卡的ViewPager_Android_Kotlin_Android Viewpager_Fragment - Fatal编程技术网

Android 具有3个以上选项卡的ViewPager

Android 具有3个以上选项卡的ViewPager,android,kotlin,android-viewpager,fragment,Android,Kotlin,Android Viewpager,Fragment,我正在尝试在我的应用程序中使用碎片实现3个以上的选项卡。在FragmentPagerAdapter中,有一个方法getItem返回Frgament,所以我的问题是,我们应该使用什么逻辑来缩短代码,因为当我们返回所有可能是10个或更多的片段时,它会非常混乱 这是我的PagerAdapter class PageAdapter(fragmentManager: FragmentManager, private val tabCount: Int) : FragmentPagerAdapter(fra

我正在尝试在我的应用程序中使用碎片实现3个以上的选项卡。在FragmentPagerAdapter中,有一个方法getItem返回Frgament,所以我的问题是,我们应该使用什么逻辑来缩短代码,因为当我们返回所有可能是10个或更多的片段时,它会非常混乱

这是我的PagerAdapter

class PageAdapter(fragmentManager: FragmentManager, private val tabCount: Int) :
FragmentPagerAdapter(fragmentManager, tabCount) {

override fun getCount() = tabCount

override fun getItem(position: Int): Fragment {
    when (position) {
        0 -> return NewsCategoryOneFragment()
        1 -> return NewsCategoryTwoFragment()
        2 -> return NewsCategoryThreeFragment()
        3 -> return NewsCategoryFourFragment()
        4 -> return NewsCategoryFiveFragment()
    }
    return NewsCategoryOneFragment()
}

override fun getPageTitle(position: Int): CharSequence? {
    when (position) {
        0 -> return "Buzzfeed"
        1 -> return "CNN"
        2 -> return "ESPN"
        3 -> return "Fortune"
        4 -> return "Fox News"
    }
    return null
}
}
有人能推荐吗。
谢谢

您应该将选项卡列表传递到页面适配器中,并从选项卡列表中按位置创建片段

例如:

data class TabItem(val title: String)

val tabItemList = listOf(
    TabItem("Buzzfeed"),
    TabItem("CNN"),
    TabItem("CNN"),
    TabItem("Fortune"),
    TabItem("Fox News")
)

class PageAdapter(
    fragmentManager: FragmentManager,
    private val tabItemList: List<TabItem>
) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

    override fun getCount() = tabItemList.size

    override fun getItem(position: Int): Fragment {
        return NewsCategoryFragment.newInstance(position)
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return tabItemList[position].title
    }
}

class NewsCategoryFragment : Fragment() {
    // ...

    companion object {
        const val KEY_CATEGORY = "category"

        fun newInstance(category: Int): NewsCategoryFragment {
            return NewsCategoryFragment().apply {
                arguments = Bundle().apply { putInt(KEY_CATEGORY, category) }
            }
        }
    }
}
数据类选项卡项(val标题:字符串)
val tabItemList=listOf(
TabItem(“Buzzfeed”),
TabItem(“CNN”),
TabItem(“CNN”),
TabItem(“财富”),
TabItem(“福克斯新闻”)
)
类页面适配器(
碎片管理器:碎片管理器,
private val tabItemList:List
):FragmentPagerAdapter(fragmentManager,行为\仅恢复\当前\片段){
重写fun getCount()=tabItemList.size
覆盖趣味getItem(位置:Int):片段{
return newCategoryFragment.newInstance(位置)
}
覆盖有趣的getPageTitle(位置:Int):字符序列{
返回tabItemList[位置].title
}
}
类NewsCategoryFragment:Fragment(){
// ...
伴星{
const val KEY_CATEGORY=“CATEGORY”
有趣的新实例(类别:Int):NewCategoryFragment{
返回NewsCategoryFragment()。应用{
arguments=Bundle().apply{putInt(KEY_CATEGORY,CATEGORY)}
}
}
}
}

好的,首先为pageTitle和其他属性/功能创建一个基本片段:

open class BaseFragment: Fragment() {
    var pageTitle: String = "Default Title"
}
您的自定义类扩展了此BaseFragment,如下所示:

class CustomFragment: BaseFragment() {
    companion object {
       fun newInstance(pageTitle: String): CustomFragment {
       val fragment = CustomFragment()
       val args = Bundle()
       args.putString("title", pageTitle)
       fragment.arguments = args
       return fragment
    }
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val args = Bundle()
    pageTitle = args.getString("title")!!
    }
}
然后创建阵列:

val fragmentList = listOf(
    CustomFragment.newInstance("title1"),
    CustomFragment.newInstance("title2"),
    CustomFragment.newInstance("title3"),
    CustomFragment.newInstance("title4"),
    CustomFragment.newInstance("title5")
)
最后,更改您的PagerAdapter:

class PageAdapter(fragmentManager: FragmentManager, private val fragmentList: List<BaseFragment>) :
    FragmentPagerAdapter(fragmentManager, fragmentList.size) {

    override fun getCount() = fragmentList.size

    override fun getItem(position: Int): Fragment {
        return fragmentList.get(position)
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return fragmentList.get(position).pageTitle
    }
}
class PageAdapter(碎片管理器:碎片管理器,私有val碎片列表:列表):
FragmentPagerAdapter(fragmentManager,fragmentList.size){
重写fun getCount()=fragmentList.size
覆盖趣味getItem(位置:Int):片段{
返回碎片列表。获取(位置)
}
覆盖有趣的getPageTitle(位置:Int):字符序列{
返回碎片列表。获取(位置)。页面标题
}
}

您可以传递包含这些片段的列表,并按位置获取片段。对于标题,创建一个包含“title”属性的“BaseFragment”。但是我如何创建这些片段的列表?我不理解@kagkarthanks For reply…..选项卡名称是否以小写字母显示