Android修行手册 - TabLayout全解析 - 和ViewPager联动

举报
芝麻粒儿 发表于 2022/09/24 21:32:55 2022/09/24
【摘要】 👉关于作者众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)欢迎关注公众号【空名先生】获取更多资源和交流! 👉前提这是小空坚持写的Android新手向系列,欢迎...

👉关于作者

众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)

欢迎关注公众号【空名先生】获取更多资源和交流!

👉前提

这是小空坚持写的Android新手向系列,欢迎品尝。

新手(√√√)

大佬(√)

👉实践过程

我们接着昨天的讲哈

😜和ViewPager联动

TabLayout图2.gif

总共分为三步:

  1. 为TabLayout添加tab
  2. 给ViewPager设置adapter
  3. 设置TabLayout和ViewPager联动

fragment_tab_item.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FragmentTabItem">
 
    <ImageView
        android:id="@+id/idFragmentTabItemImg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
 
    <TextView
        android:id="@+id/idFragmentTabItemTxt"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="@string/hello_blank_fragment"
        android:textSize="24sp" />
</FrameLayout>

FragmentTabItem.kt

private const val ARG_PARAM1 = "name"
private const val ARG_PARAM2 = "img"
 
class FragmentTabItem : Fragment() {
    // TODO: Rename and change types of parameters
    private var name: String? = null
    private var img: Int? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            name = it.getString(ARG_PARAM1)
            img = it.getInt(ARG_PARAM2)
        }
    }
 
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_tab_item, container, false)
    }
 
    override fun onStart() {
        super.onStart()
        idFragmentTabItemTxt.text = name
        //代码写的不严格 传递图片不是这么搞的。只是简单做个TabLayout的示例 不要纠结这哈
        idFragmentTabItemImg.setImageResource(img!!)
    }
    companion object {
        @JvmStatic
        fun newInstance(name: String,img:Int) =
            FragmentTabItem().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, name)
                    putInt(ARG_PARAM2, img)
                }
            }
    }
}

activity_tab_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".TabLayoutActivity">
 
    <com.google.android.material.tabs.TabLayout
        android:id="@+id/idTabLayoutFive"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        app:tabInlineLabel="true"
        app:tabRippleColor="@color/color_00ff00"
        app:tabUnboundedRipple="true"></com.google.android.material.tabs.TabLayout>
 
    <androidx.viewpager.widget.ViewPager
        android:id="@+id/idViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

TabLayoutActivity.kt

class TabLayoutActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_tab_layout)
        idTabLayoutFour.addTab(idTabLayoutFour.newTab().setText("这是"))
        idTabLayoutFive.addTab(idTabLayoutFive.newTab().setText("这是"), 0)
        idTabLayoutFive.addTab(idTabLayoutFive.newTab().setText("进行").setIcon(R.mipmap.icon_xin_no), 1)
        idTabLayoutFive.addTab(idTabLayoutFive.newTab().setText("动态"), true)
        idTabLayoutFive.addTab(idTabLayoutFive.newTab().setText("添加").setIcon(R.mipmap.icon_xin_no), 2)
        val tabFragmentList: MutableList<FragmentTabItem> = ArrayList()
        tabFragmentList.add(FragmentTabItem.newInstance("名字一",R.mipmap.study_one))
        tabFragmentList.add(FragmentTabItem.newInstance("名字二",R.mipmap.study_two))
        tabFragmentList.add(FragmentTabItem.newInstance("名字三",R.mipmap.study_three))
        tabFragmentList.add(FragmentTabItem.newInstance("名字四",R.mipmap.study_four))
        tabFragmentList.add(FragmentTabItem.newInstance("名字五",R.mipmap.study_five))
        val tabName = arrayOf("名字一", "名字二", "名字三", "名字四", "名字五")
        idViewPager.adapter = object : FragmentPagerAdapter(supportFragmentManager,BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
            override fun getCount(): Int {
                return tabFragmentList.size
            }
            override fun getItem(position: Int): Fragment {
                return tabFragmentList[position]
            }
            override fun getPageTitle(position: Int): CharSequence? {
                //如果想要icon则可以继承TabLayout自定义一个  重写setTabsFromPagerAdapter方法
                return tabName[position]
            }
        }
        idTabLayoutFive.setupWithViewPager(idViewPager,true)
    }
}

细心的同学发现了,代码中进行了addTab里面的文本和真实展示的效果文本不一样啊。没错,在tabLayout.setupWithViewPager的时候,TabLayout中先将所有tabs remove了,然后取的PagerAdapter中的getPageTitle返回值添加的tab。

image.png
而且icon也没有了,如果你想要的话就可以继承TabLayout自定义一个  重写setTabsFromPagerAdapter方法。

👉其他

📢作者:小空和小芝中的小空

📢转载说明-务必注明来源:芝麻粒儿 的个人主页 - 专栏 - 掘金 (juejin.cn)

📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。