首页
Preview

如何使用ViewPager在Fragments之间导航(带有TabLayout)

ViewPager 是一个布局管理器,允许用户通过滑动动画左右滚动浏览多个片段。适配器处理不同片段之间的所有事务。这样,用户滚动时就不必每次都调用 FragmentTransaction.replace()。在本教程后,我们会提供一些提示,以避免常见错误,并提高用户体验。你可以在这里找到这个项目的源代码。

第1步:在你的 xml 布局中放置一个 ViewPager 小部件。我将小部件放在了 activity_main.xml 中,并将其 ID 分配为 view_pager

activity_main.xml

第2步:设置你想要显示的子片段。我创建了 3 个子片段,分别称为 ChildFragment1ChildFragment2ChildFragment3。记得让它们扩展 support.v4.app.fragment。现在为这三个片段创建布局。我称它们为 child_fragment_1_layoutchild_fragment_2_layoutchild_fragment_3_layout。为简单起见,我将在每个布局中放置一个 Button(分别使用 button_1button_2button_3 作为 ID),并在单击时显示一个 Toast。重写 onCreateView() 方法并填充这些布局。将按钮连接起来以显示不同的 Toast

3 个不同的子片段(用你自己的片段替换)

每个子片段的 3 个布局(用你自己的布局替换)

ChildFragment1 中的代码。对于 ChildFragment2 和 ChildFragment3,只需将所有 1 替换为 2 和 3。

第3步:为 ViewPager 创建一个适配器。你需要扩展 FragmentPagerAdapterFragmentStatePagerAdapter。在本教程中,我们将使用 FragmentPagerAdapter。两者之间的区别可以在这里找到。在扩展 FragmentPagerAdapter 后,你需要在构造函数中调用 super(FragmentManager) 并实现 getItem(position)getCount() 方法。getItem(position) 方法用于返回从左到右按顺序对应位置的片段。因此,ChildFragment1 将在位置 0,ChildFragment2 将在位置 1,ChildFragment3 将在位置 2。getCount() 方法用于计算要显示的片段数量,在这种情况下为 3。

第4步:现在在 MainActivity 中找到你的 ViewPager 并调用 setAdapter() 方法,传入你的自定义适配器。如果你在另一个片段(嵌套片段)中执行此操作,则必须在适配器的参数中传入 getChildFragmentManager()。现在你的 ViewPager 就准备好了!

使用 TabLayout 的 ViewPager

第5步:你可以非常容易地使用 ViewPager 显示选项卡(也可以使用 ViewPagerTitleStripViewPagerTabStrip)。在你的 activity_main.xml 中包含一个 TabLayout。我将它命名为 tab_layout。记得更改你的 ViewPager 的约束,以便它不会挡住 TabLayout

第6步:进入 MainActivity,找到 TabLayout。然后调用 setupWithViewPager(),并将你的 ViewPager 作为参数传入。

第7步:最后,进入你的适配器并更改每个片段的标题。重写 getPageTitle() 方法。

你实际上可以返回 SpannableStrings 并更改文本的样式。如果你想在标题中使用图标,请查看 ImageSpan

结果应该是这样的:

避免错误和增强用户体验

问:为什么我在第一个片段中尝试从第三个片段更改某些内容时会发生异常?

答:默认情况下,ViewPager 仅加载其相邻的片段(左侧和右侧各一个),如果你尝试更改未加载的片段,则会出现错误。

问:在 ViewPager 中滚动时,我注意到有少量的输入延迟,有时 View 突然出现在页面中,而不是滑动到该位置。我该怎么办?

答:这可能有两个原因。首先,你可能在 FragmentPagerAdapter 中使用了太多的片段。考虑改用 FragmentStatePagerAdapter。如果子片段数量很大,这是更好的选择。其次,你可能在片段中加载了太多的视图。有三种方法可以解决这个问题。首先,你可以在 ViewPager 空闲时加载 View 中的内容。你可以使用 ViewPager.OnPageChangeListener 监听这种变化。其次,你可以使用 ViewPager.setOffScreenPageLimit() 方法增加默认加载的页面数。最后,你应该始终在子片段中使用 RecyclerView 而不是 ListView,因为它在用户向上或向下滚动时重用单元格。

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
阿波
The minute I see you, I want your clothes gone!

评论(0)

添加评论