浅谈ViewPager与TabLayout的简单用法
今天介绍一下ViewPager与TabLayout的简单用法
1.准备#
在一切开始之前,你懂得,先导库,老方法,在build.gradle直接添加下面这一句
implementation 'com.android.support:design:27.1.1'
可能版本有差异,具体视情况而定,知识是活的
2.设计布局
(1).主布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="@android:color/holo_blue_light"
android:gravity="center"
android:text="示例"
android:textColor="@android:color/white"
android:textSize="18sp" />
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
app:layout_constraintTop_toBottomOf="@+id/title"
android:layout_marginTop="0dp"
app:tabIndicatorColor="@android:color/holo_blue_light"
app:tabSelectedTextColor="@android:color/holo_blue_light"
app:tabTextColor="@android:color/black"
tools:ignore="NotSibling" />
<android.support.v4.view.ViewPager
android:id="@+id/view"
app:layout_constraintTop_toBottomOf="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</android.support.constraint.ConstraintLayout>
这次采用的依旧是谷歌最新的ConstraintLayout布局,里面的控件很少,第一个TextView的作用就是一个示例,告诉你当前在第几页,第二个是TabLayout,不是TableLayout,不要搞错了哈,不然又要怪我了,这里的很多属性都已经配置好了,比如下划线的颜色,选择之后的字体颜色,以及未被选择时的字体颜色。第三个是ViewPager,用来切换布局的。
(2).三个分布局
1.layout_first
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/First"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="This is the first page !"
android:gravity="center"/>
</android.support.constraint.ConstraintLayout>
2.layout_second
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/Second"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="This is the second page !"
android:gravity="center"/>
</android.support.constraint.ConstraintLayout>
3.layout_third
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/Third"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="This is the third page !"
android:gravity="center"/>
</android.support.constraint.ConstraintLayout>
以上三个布局比较简单,我就不介绍了
3.界面逻辑
(1).配置适配器
package com.project.software.myapplication;
import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
public class ViewPaperAdapter extends PagerAdapter {
private List<View>mViewList;
private List<String>mTitleLists;
public ViewPaperAdapter(List<View>mViewList,List<String>mTitleLists){
this.mViewList = mViewList;
this.mTitleLists = mTitleLists;
}
@Override
public int getCount() {
return mViewList.size(); //页卡数
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object; //官方推荐
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
container.addView(mViewList.get(position)); //添加页卡
return mViewList.get(position);
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(mViewList.get(position)); //删除页卡
}
public CharSequence getPageTitle(int position){
return mTitleLists.get(position); //页卡标题
}
}
上面的代码便是ViewPaperAdapter中的内容,他继承自PagerAdapter这个适配器,通过这个适配器,才有可能实现左右切换呦。
(2).主页逻辑
package com.project.software.myapplication;
import android.support.design.widget.TabLayout;
import android.support.v4.view.LayoutInflaterCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private TabLayout mTabLayout;
private ViewPager mViewPager;
private LayoutInflater mInflater;
private View view1;
private View view2;
private View view3;
private List<String>mTitleList = new ArrayList<>();
private List<View>mViewList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
mViewPager = findViewById(R.id.view);
mTabLayout = findViewById(R.id.tabs);
mInflater = LayoutInflater.from(this);
view1 = mInflater.inflate(R.layout.layout_first,null);
view2 = mInflater.inflate(R.layout.layout_second,null);
view3 = mInflater.inflate(R.layout.layout_third,null);
mViewList.add(view1);
mViewList.add(view2);
mViewList.add(view3);
mTitleList.add("第一页");
mTitleList.add("第二页");
mTitleList.add("第三页");
mTabLayout.setTabMode(TabLayout.MODE_FIXED);//设置tab模式,当前为系统默认模式
mTabLayout.addTab(mTabLayout.newTab().setText(mTitleList.get(0)));//添加选项卡
mTabLayout.addTab(mTabLayout.newTab().setText(mTitleList.get(1)));
mTabLayout.addTab(mTabLayout.newTab().setText(mTitleList.get(2)));
ViewPaperAdapter mAdapter = new ViewPaperAdapter(mViewList,mTitleList);
mViewPager.setAdapter(mAdapter);//给ViewPager设置适配器
mTabLayout.setupWithViewPager(mViewPager); //将TabLayout和ViewPager关联起来。
mTabLayout.setTabsFromPagerAdapter(mAdapter);//给Tabs设置适配器
}
}
上面代码的注释很详细,不过多介绍,但是将TabLayout和ViewPager关联在一起很重要哦,如果没有这句,emmmmm,你可以动手试一下结果。
最后,将那个难看的标题栏去掉,老规矩,在manifests里直接修改
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
有的同学就问了:没有标题栏岂不是更丑?没错,但是仔细回顾一下,我们已经在主布局文件里面加了一个假的标题栏呦。
最最最后,放图示效果:

Over
浅谈ViewPager与TabLayout的简单用法的更多相关文章
- 浅谈HTTP中GET、POST用法以及它们的区别
浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...
- 浅谈assert()函数的用法
#include<stdio.h> #include<assert.h> char * Strcpy(char *dst,const char *src) { assert(d ...
- 浅谈--ETCD的基本概念及用法
1. 简介 ETCD 是一个高可用的分布式键值数据库,可用于服务发现.ETCD 采用 raft 一致性算法,基于 Go 语言实现. raft是一个强一致的集群日志同步算法. ETCD使用gRPC,网络 ...
- 浅谈JS中逗号运算符的用法
阅读本文的前提是,你能区分什么是表达式,什么是语句.还有明确运算符和运算数都是些啥东西.所谓的表达式就是一个JavaScript的"短语",JavaScript的解释器可以计算它, ...
- [转]浅谈HTTP中GET、POST用法以及它们的区别
HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一个URL地址,它用于描述一个网络上的资源,而HTT ...
- 新手码农浅谈观察者模式(java语言简单实现)
一:什么是观察者模式: 官方定义:定义对象间一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 举个例子,很多人都会订阅天气预报,当气象台获得明天的天气情况( ...
- 浅谈DevExpress<五>:TreeList简单的美化——自定义单元格,加注释以及行序号
今天就以昨天的列表为例,实现以下效果:预算大于110万的单元格突出显示,加上行序号以及注释,如下图:
- 浅谈static关键字的四种用法
1.修饰成员变量 在一个person类中,一个成员变量例如 String name,当new2个person()对象时候,这2个对象在堆的位置是不同的,给name赋值张三.李四,这两个对象的name是 ...
- 浅谈 iOS 与 H5 的交互- JavaScriptCore 框架
前言 小的作为一个iOS程序猿,可能研究JavaScript以及H5相关的知识并不是为了真正的要去转行做这一方面,其实更多的为了要研究OC中的JavaScriptCore框架,JavaScriptCo ...
随机推荐
- Vue-Router中History模式
目录 history路由 官方示例 Express中间件 客户端兜底404 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在 ...
- 这些用来审计 Kubernetes RBAC 策略的方法你都见过吗?
原文链接:这些用来审计 Kubernetes RBAC 策略的方法你都见过吗? 认证与授权对任何安全系统来说都至关重要,Kubernetes 也不例外.即使我们不是安全工作人员,也需要了解我们的 Ku ...
- 记录 Java 的 BlockingQueue 中的一些坑
最近学习了 BlockingQueue,发现 java 的 BlockingQueue 并不是每一个实现都按照 BlockingQueue 的语意来的,其中有不少坑. 直接上代码吧: 1.关于Prio ...
- 深入理解Mysql索引底层数据结构与算法
索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构对比 二叉树 左边子节点的数据小于父节点数据,右边子节点的数据大于父节点数据. 如果col2是索引,查找索引为89的行元素,那么只需要查 ...
- 16.XML语法、CDATA、约束(DTD、Schema)讲解
xml主要用来描述数据,比如配置文件,网络之间传输数据等,并且在android中也经常用xml来布局,,接下来便来学习xml常用的东西 1.XML语法 xml语法分为: 1.1 文档声明 必须位于文档 ...
- CSS布局:元素水平垂直居中
CSS布局:元素水平垂直居中 本文将依次介绍在不同条件下实现水平垂直居中的多种方法 水平垂直居中是在写网页时经常会用到的需求,在上两篇博客中,分别介绍了水平居中和垂直居中的方法.本文的水平垂直居中就是 ...
- Mac应用程序无法打开或文件损坏的处理方法你知道吗?
很多用户在安装Mac软件的时候,经常会遇到提示“xxx.app已损坏,打不开.您应该将它移到废纸篓“或”打不开的xxx.app,因为它来自身份不明的开发者”,如下图的样子: 真的损坏了么?是不是真的要 ...
- Java发送邮件必带超时时间配置
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在线上遇到了一个发送邮件的问题,记录一下. 一.先说 ...
- 【管理学】PDCA
- [python]代码中包含中文,提示:SyntaxError: Non-ASCII character '\xcd'
解决方法: 把文件编码方式改为gbk即可.在代码开头写上: # coding=gbk