写点什么

Android ViewPager2 & TabLayout,fluttertextfield 高度

发布于: 2021 年 11 月 08 日

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.TabLayoutandroid:id="@+id/tabLayout"android:layout_width="match_parent"android:layout_height="wrap_content"/>


<androidx.viewpager2.widget.ViewPager2android:id="@+id/viewpager"android:layout_width="match_parent"android:layout_height="240dp"/></LinearLayout>

定义 RecyclerView Adapter 和单元布局

class DemoViewPagerAdapter : RecyclerView.Adapter<DemoViewPagerAdapter.EventViewHolder>() {val eventList = listOf("0", "1", "2")


// Layout "layout_demo_viewpager2_cell.xml" will be defined lateroverride fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =EventViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.layout_demo_viewpager2_cell, parent, false))


override fun getItemCount() = eventList.count()override fun onBindViewHolder(holder: EventViewHolder, position: Int) {(holder.view as? TextView)?.also{it.text = "Page " + eventList.get(position)


val backgroundColorResId = if (position % 2 == 0) R.color.blue else R.color.orange)it.setBackgroundColor(ContextCompat.getColor(it.context, backgroundColorResId))}}


class EventViewHolder(val view: View) : RecyclerView.ViewHolder(view)}


<?xml version="1.0" encoding="utf-8"?><TextViewxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:textSize="20sp"android:gravity="center"/>

使用 ViewPager2 绑定 RecyclerView Adapter

class ViewPager2Activity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.layout_view_pager_demo)viewpager.adapter = DemoViewPagerAdapter()}}


TabLayout 无法与 ViewPager2 绑定



但是在StackOverFlow中找到了解决方案,我们可以使用TabLayoutMediator实现 TabLayout 与 ViewPager2 的绑定。



TabLayoutMediator 不能直接使用,所以需要拷贝一份出来,根据代码注释可知 TabLayoutMediator 只能在初始化之后才能调用 attach 方法:



class ViewPager2Activity : AppCompatActivity() {


override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_view_pager2)


// Must be declared before TabLayoutMediator.attach()viewpager.adapter = DemoViewPagerAdapter()TabLayoutMediator(tabLayout, viewpager, object : TabLayoutMediator.OnConfigureTabCallback {override fun onConfigureTab(tab: TabLayout.Tab, position: Int) {// Styling each tab heretab.setText("Tab $position")}}).attach()}}


TabLayoutMediator.OnConfigureTabCallback 是一个用户友好的方法,在初始化 TabLayout.Tab 或数据更改是调用:


![image.png](https://user-gold-cdn.xitu.io/2019/9/10/16d198b03ecdbd74?ima


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


geView2/0/w/1280/h/960/ignore-error/1)

RecyclerView adapter Vs FragmentStateAdapter


ViewPager2 可以接受 RecyclerView Adapter 和 FragmentStateAdapter,两者的区别就是 RecyclerView Adapter inflate View,而 FragmentStateAdapter inflate Fragment。


当 ViewPager2 中的每个页面用于显示静态信息时,当必须考虑页面的生命周期时,可以使用 FragmentStateAdapter。

集成 TabLayout

TabLayout 与旧版 ViewPager 集成在一起很简单,只需将其添加为 ViewPager 的子项,并按设置 layout_gravity 属性就可以了。


<android.support.v4.view.ViewPagerandroid:layout_width="match_parent"android:layout_height="match_parent"><android.support.design.widget.TabLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"

评论

发布
暂无评论
Android ViewPager2 & TabLayout,fluttertextfield高度