ViewPager2 的参数配置主要通过 XML 布局文件 和 Java/Kotlin 代码 两种方式完成。

核心 XML 参数 (在 layout 文件中配置)
这些参数直接写在 ViewPager2 标签里,用于定义其基本外观和行为。
android:id
为 ViewPager2 设置一个唯一的 ID,方便在代码中引用。
android:id="@+id/viewPager2"
android:layout_width 和 android:layout_height
设置 ViewPager2 的宽度和高度,通常是 match_parent。
android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation
这是一个非常重要的参数! 它决定了页面的滑动方向和页面的排列方向。

horizontal(默认): 水平滑动,页面左右排列。vertical: 垂直滑动,页面上下排列。
示例:垂直滑动
<androidx.viewpager2.widget.ViewPager2
...
android:orientation="vertical" />
app:layoutManager
虽然 ViewPager2 默认使用 LinearLayoutManager,但你可以通过这个参数明确指定其管理器类型,这对于实现垂直滑动或未来可能的扩展很有用。
androidx.recyclerview.widget.LinearLayoutManager: 线性布局管理器。androidx.recyclerview.widget.LinearLayoutManager.orientation属性决定了方向(水平或垂直)。
androidx.recyclerview.widget.ArcLayoutManager: (实验性) 弧形布局管理器。
示例:通过代码设置垂直方向(推荐方式)
虽然可以在 XML 中设置 orientation,但更常见的做法是在代码中设置,这样可以动态改变方向。
<!-- 在 XML 中只指定类型 -->
<androidx.viewpager2.widget.ViewPager2
...
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
然后在代码中:
viewPager2.apply {
// 设置为垂直方向
layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
}
android:clipToPadding是否裁剪到内边距区域。
true(默认): 内容不会延伸到 padding 区域之外。false: 内容可以延伸到 padding 区域之外,这常用于创建“页面指示器”与页面内容之间的空间效果。 不裁剪到内边距**<androidx.viewpager2.widget.ViewPager2 ... android:clipToPadding="false" android:padding="16dp" />
这样,页面的内容会从
padding的边缘开始,而不会完全填满整个ViewPager2。
android:overScrollMode
控制滚动到边界时的回弹效果。
auto(默认): 默认的回弹效果。always: 始终显示回弹效果。never: 从不显示回弹效果。
示例:禁用回弹效果
<androidx.viewpager2.widget.ViewPager2
...
android:overScrollMode="never" />
核心 Java/Kotlin 代码参数 (在 Activity/Fragment 中配置)
这些是通过 ViewPager2 对象的方法来设置的,用于实现动态行为和数据绑定。
setAdapter(Adapter)
这是 ViewPager2 的核心方法,用于设置数据适配器,适配器负责提供页面内容。
适配器类型:
FragmentStateAdapter: 用于管理Fragment页面,这是最常见的用法,它会自动保存和恢复 Fragment 的状态。RecyclerView.Adapter: 用于管理普通的 View (如ImageView,TextView等)。
示例:使用 FragmentStateAdapter
class MyAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {
// 返回总共有多少个页面
override fun getItemCount(): Int = 5
// 为指定位置创建并返回一个 Fragment
override fun createFragment(position: Int): Fragment {
return PageFragment.newInstance(position) // 假设你有一个 PageFragment
}
}
// 在 Activity 或 Fragment 中设置适配器
viewPager2.adapter = MyAdapter(this)
registerOnPageChangeCallback(OnPageChangeCallback)
监听页面滑动事件,类似于 ViewPager.OnPageChangeListener,但 ViewPager2 使用了更现代的回调方式。
常用回调方法:
onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int): 页面滑动时持续调用。onPageSelected(position: Int): 新页面被选中时调用(滑动结束时)。onPageScrollStateChanged(state: Int): 滑动状态改变时调用 (STATE_IDLE,STATE_DRAGGING,STATE_SETTLING)。
示例:监听页面切换
viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
Log.d("ViewPager2", "当前页面: $position")
// 更新页面指示器等
}
})
注意:记得在不需要时(如 onDestroy)调用 unregisterOnPageChangeCallback() 以避免内存泄漏。
setCurrentItem(item: Int, smoothScroll: Boolean)
跳转到指定的页面。
item: 目标页面的索引(从 0 开始)。smoothScroll: 是否平滑滚动。true表示平滑滚动,false表示立即跳转。
示例:平滑滚动到第 2 页
viewPager2.setCurrentItem(1, true) // 索引 1 对应第 2 页
isUserInputEnabled
一个非常有用的属性,用于控制用户是否可以手动滑动页面。
true(默认): 允许用户滑动。false: 禁止用户滑动,此时页面只能通过代码(setCurrentItem)来切换。
示例:禁用手动滑动
viewPager2.isUserInputEnabled = false
offscreenPageLimit
控制预加载的页面数量,当用户滑动时,ViewPager2 会提前加载相邻的页面,以提高滑动流畅度。
1(默认): 默认预加载一个相邻页面。0: 不预加载,可能会影响滑动流畅度。N: 预加载 N 个页面,注意,这个值不宜过大,否则会消耗更多内存。
示例:设置预加载 2 个页面
viewPager2.offscreenPageLimit = 2
高级功能与参数
结合 TabLayout (TabLayout + ViewPager2)
ViewPager2 与 Material Components 的 TabLayout 结合使用非常方便。
关键点:
- 使用
TabLayoutMediator来连接TabLayout和ViewPager2。 TabLayoutMediator会自动根据ViewPager2的页面数量创建 Tab,并处理点击事件。
示例代码:
val tabLayout = findViewById<TabLayout>(R.id.tab_layout)
val viewPager2 = findViewById<ViewPager2>(R.id.view_pager2)
// 设置 ViewPager2 的适配器
viewPager2.adapter = MyAdapter(this)
// 创建并连接 TabLayout 和 ViewPager2
TabLayoutMediator(tabLayout, viewPager2) { tab, position ->
// 为每个 Tab 设置标题
tab.text = "页面 ${position + 1}"
}.attach() // 必须调用 attach() 方法
实现翻转效果 (Reverse Drawing Order)
ViewPager2 可以轻松实现类似书本翻页的“反向绘制”效果,这通过 RecyclerView.ItemDecoration 实现。
关键点:
- 创建一个
ItemDecoration。 - 在
onDrawOver方法中,根据ViewPager2的滑动方向和位置,反向绘制页面内容。
这是一个相对复杂的自定义,通常需要参考官方示例或第三方库,但核心思想是利用 ViewPager2 提供的滑动状态和位置信息来手动控制绘制顺序。
总结表格
| 参数/方法 | 位置 | 作用 | 常用值/示例 |
|---|---|---|---|
android:orientation |
XML | 设置滑动和排列方向 | horizontal, vertical |
app:layoutManager |
XML | 指定布局管理器 | androidx.recyclerview.widget.LinearLayoutManager |
android:clipToPadding |
XML | 是否裁剪内容到内边距 | true, false |
setAdapter() |
代码 | 核心:设置数据源 | new FragmentStateAdapter(...) |
registerOnPageChangeCallback() |
代码 | 监听页面滑动事件 | new ViewPager2.OnPageChangeCallback() {...} |
setCurrentItem() |
代码 | 跳转到指定页面 | viewPager2.setCurrentItem(1, true) |
isUserInputEnabled |
代码 | 是否允许用户手动滑动 | true, false |
offscreenPageLimit |
代码 | 设置预加载页面数量 | 1, 2 |
TabLayoutMediator |
代码 | 连接 TabLayout 和 ViewPager2 |
new TabLayoutMediator(...).attach() |
希望这份详细的解析能帮助你全面掌握 ViewPager2 的参数配置!
