Android ViewPager2 & TabLayout,fluttertextfield 高度
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
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"
评论