TabLayout+ViewPager實(shí)現(xiàn)切頁(yè)的示例代碼
安卓使用TabLayout+ViewPager+Fragment 實(shí)現(xiàn)頁(yè)面切換,可實(shí)現(xiàn)左右滑動(dòng)切換視圖界面和點(diǎn)擊切換
可自定義菜單欄是在頂部還是在底部
一、實(shí)現(xiàn)效果:

二、實(shí)現(xiàn)過(guò)程:
2.1 一些重要的設(shè)置
添加必須依賴:
因?yàn)樾枰褂茫篿mport android.support.design.widget.TabLayout;,所以必須添加下列依賴
compile 'com.android.support:design:23.3.0'
主布局文件編寫:
頂部或者底部顯示,只要更改ViewPager和TabLayout排列順序即可
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:paddingBottom="0dp"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:orientation="vertical"
android:paddingTop="0dp"
tools:context="com.example.fafa.MainActivity">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>
<!--
app:tabIndicatorColor="" 指示器顏色
app:tabIndicatorHeight="" 指示器高度,設(shè)置為0就是沒(méi)有指示器
app:tabTextColor="" Tab文本默認(rèn)顏色
app:tabSelectedTextColor="" Tab文本被選中后的顏色
app:tabTextAppearance="" 為Tab文本設(shè)置樣式,一般是需要為Tab加圖標(biāo)時(shí)使用
app:tabMode="" 只有兩個(gè)值:fixed、scrollable
其中 fixed用于標(biāo)題欄少的情況,每個(gè)Tab可以平分屏幕寬度
其中 scrollable用于標(biāo)題欄多出屏幕的情況,如果標(biāo)題欄少的時(shí)候用很難看,占不滿屏幕
app:tabGravity="center" 整體居中,不可與上共用
app:tabBackground="" TabLayout背景,和android:background=""效果一樣
app:tabGravity="" 對(duì)齊方式: 居中顯示center、fill填滿
-->
<android.support.design.widget.TabLayout
android:id="@+id/tabs2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
app:tabMode="fixed"
app:tabIndicatorColor="@color/colorLv"
app:tabTextColor="@android:color/black"
app:tabSelectedTextColor="@color/colorred"
/>
</LinearLayout>
2.2 僅字符菜單欄顯示實(shí)現(xiàn):
未加入圖片顯示,實(shí)現(xiàn)較為簡(jiǎn)單

基本邏輯代碼:
每個(gè)界面使用不同的fragment,進(jìn)行一 一對(duì)應(yīng)
import android.support.design.widget.TabLayout;
public class MainActivity extends AppCompatActivity {
private ViewPager viewPager;
private TabLayout tabLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tabLayout = (TabLayout) findViewById(R.id.tabs2);
viewPager = (ViewPager) findViewById(R.id.viewpager);
//設(shè)置界面文件和文字一一對(duì)應(yīng)
final Fragment[] fragments = {new Fragment0(), new Fragment1(), new Fragment2()};
final String[] titles = {"界面1", "界面2", "界面3"};
//添加tablayout中的豎線,每一項(xiàng)的中間分隔線
//LinearLayout linearLayout = (LinearLayout) tabLayout.getChildAt(0);
// linearLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
// linearLayout.setDividerDrawable(ContextCompat.getDrawable(this, R.mipmap.fg));
//每項(xiàng)只進(jìn)入一次
viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
return fragments[position];
}
@Override
public int getCount() {
return fragments.length;
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
});
tabLayout.setupWithViewPager(viewPager);
tabLayout.getTabAt(1).select();//設(shè)置第一個(gè)為選中
}
}
2.3 字符和圖片菜單欄實(shí)現(xiàn)
圖片加漢字菜單欄,菜單欄每項(xiàng)都是一個(gè)視圖可以自定義設(shè)計(jì)

菜單欄每項(xiàng)的布局文件設(shè)計(jì):
一個(gè)圖片顯示和一個(gè)文字顯示,定義為垂直布局,其中android:layout_gravity="center"是把控件居中,這里不寫,在菜單欄顯示時(shí)可能會(huì)出現(xiàn)錯(cuò)位
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:id="@+id/item_view"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:src="@mipmap/ic_launcher"
android:id="@+id/item_img"
android:layout_gravity="center"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:text="xxxx"
android:layout_gravity="center"
android:id="@+id/item_text"
android:layout_height="wrap_content" />
</LinearLayout>
主布局文件更改:
在主布局文件的<android.support.design.widget.TabLayout>更改android:layout_height="70dp",表示其菜單欄的高度改變。
定義必要的類變量:
private ViewPager viewPager;
private TabLayout tabLayout;
//設(shè)置界面文件和文字一一對(duì)應(yīng)
private Fragment[] Lfragments = {new Fragment0(), new Fragment1(), new Fragment2(),new Fragment3()};
private String[] Ltitles = {"界面1", "界面2", "界面3","界面4"};
//未選中圖片
private int[] Limg = {R.mipmap.an1,R.mipmap.an2,R.mipmap.an3,R.mipmap.an4};
//選中圖片
private int[] Limgn = {R.mipmap.ann1,R.mipmap.ann2,R.mipmap.ann3,R.mipmap.ann4};
//配置默認(rèn)選中第幾項(xiàng)
private int ItemWhat=1;
數(shù)據(jù)初始化及基本界面加載:
//只進(jìn)入一次,初始化
viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
return Lfragments[position];
}
@Override
public int getCount() {
return Lfragments.length;
}
@Override
public CharSequence getPageTitle(int position) {
return Ltitles[position];
}
});
//綁定
tabLayout.setupWithViewPager(viewPager);
//設(shè)置默認(rèn)選中頁(yè),宏定義
tabLayout.getTabAt(ItemWhat).select();
viewPager.setOffscreenPageLimit(3); //設(shè)置向左和向右都緩存的頁(yè)面?zhèn)€數(shù)
//初始化菜單欄顯示
for (int i = 0; i < tabLayout.getTabCount(); i++) {
//尋找到控件
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.items, null);
LinearLayout mTabView = (LinearLayout) view.findViewById(R.id.item_view);
TextView mTabText = (TextView) view.findViewById(R.id.item_text);
ImageView mTabIcon = (ImageView) view.findViewById(R.id.item_img);
mTabText.setText(Ltitles[i]);
mTabIcon.setImageResource(Limg[i]);
//設(shè)置不可點(diǎn)擊
// mTabView.setClickable(true);
//更改選中項(xiàng)樣式
if(i==ItemWhat){
mTabIcon.setImageResource(Limgn[i]);
mTabText.setTextColor(ContextCompat.getColor(this, R.color.colorRed));
}
//設(shè)置樣式
tabLayout.getTabAt(i).setCustomView(view);
}
監(jiān)聽選擇事件:
//是否選中監(jiān)聽
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
//選中時(shí)進(jìn)入,改變樣式
ItemSelect(tab);
//onTabselected方法里面調(diào)用了viewPager的setCurrentItem 所以要想自定義OnTabSelectedListener,也加上mViewPager.setCurrentItem(tab.getPosition())就可以了
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
//未選中進(jìn)入,改變樣式
ItemNoSelect(tab);
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
//重新選中
}
});
選中和非選中,更改其中顯示樣式:
//某個(gè)項(xiàng)選中,改變其樣式
private void ItemSelect(TabLayout.Tab tab) {
View customView = tab.getCustomView();
TextView tabText = (TextView) customView.findViewById(R.id.item_text);
ImageView tabIcon = (ImageView) customView.findViewById(R.id.item_img);
tabText.setTextColor(ContextCompat.getColor(this, R.color.colorRed));
String stitle = tabText.getText().toString();
for(int i=0;i<Ltitles.length;i++){
if(Ltitles[i].equals(stitle)){
//Toast.makeText(MainActivity.this,"xxx+"+i,Toast.LENGTH_SHORT).show();
tabIcon.setImageResource(Limgn[i]);
}
}
}
//某個(gè)項(xiàng)非選中,改變其樣式
private void ItemNoSelect(TabLayout.Tab tab) {
View customView = tab.getCustomView();
TextView tabText = (TextView) customView.findViewById(R.id.item_text);
ImageView tabIcon = (ImageView) customView.findViewById(R.id.item_img);
tabText.setTextColor(ContextCompat.getColor(this, R.color.colorBlack));
String stitle = tabText.getText().toString();
for(int i=0;i<Ltitles.length;i++){
if(Ltitles[i].equals(stitle)){
tabIcon.setImageResource(Limg[i]);
}
}
}
整體代碼:
import android.support.design.widget.TabLayout;
public class MainActivity extends AppCompatActivity {
private ViewPager viewPager;
private TabLayout tabLayout;
//設(shè)置界面文件和文字一一對(duì)應(yīng)
private Fragment[] Lfragments = {new Fragment0(), new Fragment1(), new Fragment2(),new Fragment3()};
private String[] Ltitles = {"界面1", "界面2", "界面3","界面4"};
//未選中圖片
private int[] Limg = {R.mipmap.an1,R.mipmap.an2,R.mipmap.an3,R.mipmap.an4};
//選中圖片
private int[] Limgn = {R.mipmap.ann1,R.mipmap.ann2,R.mipmap.ann3,R.mipmap.ann4};
//配置默認(rèn)選中第幾項(xiàng)
private int ItemWhat=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找控件
tabLayout = (TabLayout) findViewById(R.id.tabs2);
viewPager = (ViewPager) findViewById(R.id.viewpager);
//添加tablayout中的豎線,每一項(xiàng)的中間分隔線
//LinearLayout linearLayout = (LinearLayout) tabLayout.getChildAt(0);
// linearLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
// linearLayout.setDividerDrawable(ContextCompat.getDrawable(this, R.mipmap.fg));
//只進(jìn)入一次,初始化
viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
return Lfragments[position];
}
@Override
public int getCount() {
return Lfragments.length;
}
@Override
public CharSequence getPageTitle(int position) {
return Ltitles[position];
}
});
//綁定
tabLayout.setupWithViewPager(viewPager);
//設(shè)置默認(rèn)選中頁(yè),宏定義
tabLayout.getTabAt(ItemWhat).select();
viewPager.setOffscreenPageLimit(3); //設(shè)置向左和向右都緩存的頁(yè)面?zhèn)€數(shù)
//初始化菜單欄顯示
for (int i = 0; i < tabLayout.getTabCount(); i++) {
//尋找到控件
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.items, null);
LinearLayout mTabView = (LinearLayout) view.findViewById(R.id.item_view);
TextView mTabText = (TextView) view.findViewById(R.id.item_text);
ImageView mTabIcon = (ImageView) view.findViewById(R.id.item_img);
mTabText.setText(Ltitles[i]);
mTabIcon.setImageResource(Limg[i]);
//設(shè)置不可點(diǎn)擊
// mTabView.setClickable(true);
//更改選中項(xiàng)樣式
if(i==ItemWhat){
mTabIcon.setImageResource(Limgn[i]);
mTabText.setTextColor(ContextCompat.getColor(this, R.color.colorRed));
}
//設(shè)置樣式
tabLayout.getTabAt(i).setCustomView(view);
}
//是否選中監(jiān)聽
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
//選中時(shí)進(jìn)入,改變樣式
ItemSelect(tab);
//onTabselected方法里面調(diào)用了viewPager的setCurrentItem 所以要想自定義OnTabSelectedListener,也加上mViewPager.setCurrentItem(tab.getPosition())就可以了
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
//未選中進(jìn)入,改變樣式
ItemNoSelect(tab);
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
//重新選中
}
});}
//某個(gè)項(xiàng)選中,改變其樣式
private void ItemSelect(TabLayout.Tab tab) {
View customView = tab.getCustomView();
TextView tabText = (TextView) customView.findViewById(R.id.item_text);
ImageView tabIcon = (ImageView) customView.findViewById(R.id.item_img);
tabText.setTextColor(ContextCompat.getColor(this, R.color.colorRed));
String stitle = tabText.getText().toString();
for(int i=0;i<Ltitles.length;i++){
if(Ltitles[i].equals(stitle)){
//Toast.makeText(MainActivity.this,"xxx+"+i,Toast.LENGTH_SHORT).show();
tabIcon.setImageResource(Limgn[i]);
}
}
}
//某個(gè)項(xiàng)非選中,改變其樣式
private void ItemNoSelect(TabLayout.Tab tab) {
View customView = tab.getCustomView();
TextView tabText = (TextView) customView.findViewById(R.id.item_text);
ImageView tabIcon = (ImageView) customView.findViewById(R.id.item_img);
tabText.setTextColor(ContextCompat.getColor(this, R.color.colorBlack));
String stitle = tabText.getText().toString();
for(int i=0;i<Ltitles.length;i++){
if(Ltitles[i].equals(stitle)){
tabIcon.setImageResource(Limg[i]);
}
}
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- TabLayout實(shí)現(xiàn)ViewPager指示器的方法
- Android 中基于TabLayout+ViewPager實(shí)現(xiàn)標(biāo)簽卡效果
- TabLayout關(guān)聯(lián)ViewPager后不顯示文字的解決方法
- Android中TabLayout+ViewPager實(shí)現(xiàn)tab和頁(yè)面聯(lián)動(dòng)效果
- Android中TabLayout+ViewPager 簡(jiǎn)單實(shí)現(xiàn)app底部Tab導(dǎo)航欄
- Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換
- Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換效果
- AndroidUI組件SlidingTabLayout實(shí)現(xiàn)ViewPager頁(yè)滑動(dòng)效果
- TabLayout+ViewPager2的簡(jiǎn)單使用詳解
相關(guān)文章
基于Android studio3.6的JNI教程之ncnn人臉檢測(cè)mtcnn功能
這篇文章主要介紹了基于Android studio3.6的JNI教程之ncnn之人臉檢測(cè)mtcnn功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Android從xml加載到View對(duì)象過(guò)程解析
這篇文章主要介紹了 Android從xml加載到View對(duì)象過(guò)程解析的相關(guān)資料,需要的朋友可以參考下2016-03-03
Android OkHttp Post上傳文件并且攜帶參數(shù)實(shí)例詳解
這篇文章主要介紹了Android OkHttp Post上傳文件并且攜帶參數(shù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03
Android WebView的使用方法及與JS 相互調(diào)用
這篇文章主要介紹了Android WebView的使用方法及與JS 相互調(diào)用的相關(guān)資料,WebView 是 Android 中一個(gè)非常實(shí)用的組​件, WebView 可以使得網(wǎng)頁(yè)輕松的內(nèi)嵌到app里,還可以直接跟js相互調(diào)用,需要的朋友可以參考下2017-07-07
Kotlin中?和!!的區(qū)別詳細(xì)對(duì)比
這篇文章主要給大家介紹了關(guān)于Kotlin中?和!!區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05

