TabLayout + ViewPager
一、实现思路
1、在build.gradle中添加依赖,例如:
compile 'com.android.support:support-v4:23.4.0'
compile 'com.android.support:design:23.4.0'
也可以将support-v4替换为appcompat-v7,例如:
compile 'com.android.support:appcompat-v7:23.4.0'
因为appcompat-v7是依赖于support-v4的。
更多说明可参考官方文档support library部分。
2、在xml中添加TabLayout和ViewPager,例如:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tool="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tool:context=".TabViewActivity"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"> <android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/tabLayoutBackground"
app:tabMode="scrollable"
app:tabTextColor="@color/color_white"
app:tabSelectedTextColor="@color/tabSelectedText"
app:tabIndicatorHeight="3dp"
app:tabIndicatorColor="@color/color_white"/> <android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"/> </LinearLayout>
TabLayout:
(1)tabMode有两个属性,一个是"scrollable",用于多标签;另一个是"fixed",用于少标签,它会让全部标签平均分布在屏幕上,所以标签不能多,而且名称也不能长,否则会显示不完整。
(2)tabIndicator是指文本下的指示条。当选中一个tab时,指示条才会出现,出现在文本下面。
3、获取View对象
TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
4、创建FragmentStatePagerAdaper的子类,并实现构造方法
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
}
创建该类的一个实例对象
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
在这一步中,你可以选择是实现FragmentPagerAdapter的子类,或者是FragmentStatePagerAdapter的子类。
FragmentPagerAdapter用于页数较少的,也就Fragment的数量较少的,因为只要用户还停留在当前的Activity中,其中的Fragment都不会被销毁,所以内存消耗会比较大。
而FragmentStatePagerAdapter的工作原理类似于ListView,只要用户不可见的Fragment,都会被销毁,只保留它的状态。
因为我用的是v4兼容包下的Fragment,所以需要用getSupportFragmentManager()去获取FragmentManager。
5、设置ViewPager和TabLayout
viewPager.setAdapter(viewPagerAdapter);
tabLayout.setupWithViewPager(viewPager);
二、完善Adapter
1、重写三个方法
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
......
@Override
public Fragment getItem(int position) {
return null;
}
@Override
public int getCount() {
return ;
}
@Override
public CharSequence getPageTitle(int position) {
return super.getPageTitle(position);
}
}
2、创建tab的标题数据:
private String[] mTitles = new String[]{"语文", "英语", "数学", "物理", "生物", "化学", "地理", "政治", "历史"};
创建Fragment的子类:
public class ViewPagerFragment extends Fragment {
private static final String KEY = "extra";
private String mMessage;
public ViewPagerFragment() {
}
public static ViewPagerFragment newInstance(String extra) {
Bundle args = new Bundle();
args.putString(KEY, extra);
ViewPagerFragment fragment = new ViewPagerFragment();
fragment.setArguments(args);
return fragment;
}
}
创建Fragment的集合对象,并添加实例对象到集合里:
private ArrayList<ViewPagerFragment> mViewPagerFragments = new ArrayList<>();
......
for (int i = 0; i < mTitles.length; i++) {
mViewPagerFragments.add(ViewPagerFragment.newInstance(mTitles[i]));
}
3、修改Adapter中的方法
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private String[] titles;
private ArrayList<ViewPagerFragment> viewPagerFragments;
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
public void setTitles(String[] titles) {
this.titles = titles;
}
public void setFragments(ArrayList<ViewPagerFragment> viewPagerFragments) {
this.viewPagerFragments = viewPagerFragments;
}
@Override
public Fragment getItem(int position) {
return viewPagerFragments.get(position);
}
@Override
public int getCount() {
return viewPagerFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
}
4、将数据传给Adapter
viewPagerAdapter.setTitles(mTitles);
viewPagerAdapter.setFragments(mViewPagerFragments);
三、完善Fragment
1、fragment_view_pager_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"> <TextView
android:id="@+id/fragment_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"/> </LinearLayout>
2、完善Fragment的方法
public class ViewPagerFragment extends Fragment {
......
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
if (bundle != null) {
mMessage = bundle.getString(KEY);
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_view_pager_item, container, false);
TextView textView = (TextView) view.findViewById(R.id.fragment_text);
textView.setText(mMessage);
return view;
}
}
在创建Fragment时,会调用onCreate方法,在其中执行一些状态信息的初始化,用于暂停或停止后的恢复所用。
在Fragment首次加载视图时,会调用onCreateView方法,在其中执行视图的加载和初始化,返回的应该是该Fragment布局的根视图。其中inflate方法的第三个参数代表的意思是,是否要将加载进来的布局(R.layout.fragment_view_pager_item)添加进container这个ViewGroup里。根据官方文档的说明,上例那样做的话,系统已经将这个布局添加进container了,所以这里为false。
静态效果图:

TabLayout + ViewPager的更多相关文章
- 使用FragmentTabHost+TabLayout+ViewPager实现双层嵌套Tab
大多数应用程序都会在底部使用3~5个Tab对应用程序的主要功能进行划分,对于一些信息量非常大的应用程序,还需要在每个Tab下继续划分子Tab对信息进行分类显示. 本文实现采用FragmentTabHo ...
- 浅谈TabLayout(ViewPager+Tab联动)
google发布了的Android Support Design库中提供了TabLayout 通过TabLayout+ViewPager实现导航栏效果,点击Tab ,ViewPager跟随变化,滑动V ...
- 介绍三个Android支持库控件:TabLayout+ViewPager+RecyclerView
本文主要介绍如下三个Android支持库控件的配合使用: TabLayout:android.support.design.widget.TabLayout ViewPager:android.sup ...
- [置顶]
xamarin Tablayout+Viewpager+Fragment顶部导航栏
最近几天不忙,所以把项目中的顶部导航栏的实现归集一下.android中使用TabLayout+ViewPager+Fragment制作顶部导航非常常见,代码实现也比较简单.当然我这个导航栏是基于xam ...
- Android开发之漫漫长途 Fragment番外篇——TabLayout+ViewPager+Fragment
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- ViewPagerWithRecyclerDemo【RecyclerView+ViewPager实现类似TabLayout+ViewPager效果】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用RecyclerView+ViewPager实现类似TabLayout+ViewPager效果. 效果图 使用步骤 一.项目组织 ...
- 安卓TabLayout+ViewPager实现切页
安卓使用TabLayout+ViewPager+Fragment 实现页面切换,可实现左右滑动切换视图界面和点击切换 可自定义菜单栏是在顶部还是在底部 一.实现效果: 二.实现过程: 2.1 一些重要 ...
- TabLayout+ViewPager 标题不显示问题
第一次用TabLayout+ViewPager 组合在布局中写好了三个标题预览没问题而且也设置了 app:tabIndicatorColor="@color/colorAccent" ...
- TabLayout+ViewPager的简单使用
1. build.gradle文件中加入 compile 'com.android.support:design:22.2.0' 2.写Xml文件,注意TabLayout的三个属性 app:tab ...
随机推荐
- 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态
最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考. 换工作心里挺忐忑, 对未来也充满了憧憬与担忧.(虽然已是老人, 换了N次工作了,但每次心里都和忐忑). 写写代 ...
- opencv源码:cascadedetect
级联分类器检测类CascadeClassifier,提供了两个重要的方法: CascadeClassifier cascade_classifier; cascade_classifier.load( ...
- SASS教程sass超详细教程
SASS安装及使用(sass教程.详细教程) 采用SASS开发CSS,可以提高开发效率. SASS建立在Ruby的基础之上,所以得先安装Ruby. Ruby的安装: 安装 rubyinstaller- ...
- 利用bootstrap的carousel.js实现轮播图动画
前期准备: 1.jquery.js. 2.bootstrap的carousel.js. 3.bootstrap.css. 如果大家不知道在哪下载,可以联系小颖,小颖把这些js和css可以发送给你. 一 ...
- Vue + Webpack + Vue-loader 系列教程(1)功能介绍篇
原文地址:https://lvyongbo.gitbooks.io/vue-loader/content/ Vue-loader 是什么? vue-loader 是一个加载器,能把如下格式的 Vue ...
- 关于Vue.js 2.0 的 Vuex 2.0,你需要更新的知识库
应用结构 实际上,Vuex 在怎么组织你的代码结构上面没有任何限制,相反,它强制规定了一系列高级的原则: 应用级的状态集中放在 store 中. 改变状态的唯一方式是提交mutations,这是个同步 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-补充WebApi与Unity注入-配置文件
系列目录 上一篇演示了WebApi利用Unity注入 很多人问我如何用配置文件来配置注入,本节演示如何利用配置文件来注入,道理是一样的,跳转到上一节下载源码一起来动手! 1.打开源码定位到文件Depe ...
- Entity Framework 手动使用migration里面的up 和down方法。
add-migration -IgnoreChanges 201606100717405_201606100645298_InitialCreate 执行这一句后 ,清空使用map生成的代码,个人不太 ...
- 页面布局class常见命名规范
头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中:left rig ...
- JavaScript中String对象的方法介绍
1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...