TabLayout+ViewPager实现切页的示例代码

安卓使用TabLayout+ViewPager+Fragment 实现页面切换,可实现左右滑动切换视图界面和点击切换

可自定义菜单栏是在顶部还是在底部

一、实现效果:

二、实现过程:

2.1 一些重要的设置

添加必须依赖:

因为需要使用:import 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="" 指示器高度,设置为0就是没有指示器
app:tabTextColor=""  Tab文本默认颜色
app:tabSelectedTextColor=""   Tab文本被选中后的颜色
app:tabTextAppearance=""   为Tab文本设置样式,一般是需要为Tab加图标时使用
app:tabMode="" 只有两个值:fixed、scrollable
其中 fixed用于标题栏少的情况,每个Tab可以平分屏幕宽度
其中 scrollable用于标题栏多出屏幕的情况,如果标题栏少的时候用很难看,占不满屏幕
app:tabGravity="center" 整体居中,不可与上共用
app:tabBackground=""  TabLayout背景,和android:background=""效果一样
app:tabGravity=""  对齐方式: 居中显示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 仅字符菜单栏显示实现:

未加入图片显示,实现较为简单

基本逻辑代码:

每个界面使用不同的fragment,进行一 一对应

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);

    //设置界面文件和文字一一对应
    final Fragment[] fragments = {new Fragment0(), new Fragment1(), new Fragment2()};
    final String[] titles = {"界面1", "界面2", "界面3"};

 //添加tablayout中的竖线,每一项的中间分隔线
 //LinearLayout linearLayout = (LinearLayout) tabLayout.getChildAt(0);
// linearLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
// linearLayout.setDividerDrawable(ContextCompat.getDrawable(this, R.mipmap.fg));

 //每项只进入一次
 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();//设置第一个为选中
  }
}

2.3 字符和图片菜单栏实现

图片加汉字菜单栏,菜单栏每项都是一个视图可以自定义设计

菜单栏每项的布局文件设计:

一个图片显示和一个文字显示,定义为垂直布局,其中android:layout_gravity="center"是把控件居中,这里不写,在菜单栏显示时可能会出现错位

<?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;
 //设置界面文件和文字一一对应
 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};
//配置默认选中第几项
 private int ItemWhat=1;

数据初始化及基本界面加载:

//只进入一次,初始化
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);

//设置默认选中页,宏定义
tabLayout.getTabAt(ItemWhat).select();
viewPager.setOffscreenPageLimit(3); //设置向左和向右都缓存的页面个数
//初始化菜单栏显示
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]);
  //设置不可点击
  // mTabView.setClickable(true);

  //更改选中项样式
  if(i==ItemWhat){
    mTabIcon.setImageResource(Limgn[i]);
    mTabText.setTextColor(ContextCompat.getColor(this, R.color.colorRed));
  }

  //设置样式
  tabLayout.getTabAt(i).setCustomView(view);
}

监听选择事件:

//是否选中监听
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
  @Override
  public void onTabSelected(TabLayout.Tab tab) {
   //选中时进入,改变样式
    ItemSelect(tab);
    //onTabselected方法里面调用了viewPager的setCurrentItem 所以要想自定义OnTabSelectedListener,也加上mViewPager.setCurrentItem(tab.getPosition())就可以了
    viewPager.setCurrentItem(tab.getPosition());
  }

  @Override
  public void onTabUnselected(TabLayout.Tab tab) {
   //未选中进入,改变样式
    ItemNoSelect(tab);

  }

  @Override
  public void onTabReselected(TabLayout.Tab tab) {
   //重新选中

  }
});

选中和非选中,更改其中显示样式:

//某个项选中,改变其样式
 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]);
     }
   }
 }
//某个项非选中,改变其样式
 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;
  //设置界面文件和文字一一对应
  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};
  //配置默认选中第几项
  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中的竖线,每一项的中间分隔线
    //LinearLayout linearLayout = (LinearLayout) tabLayout.getChildAt(0);
    // linearLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
    // linearLayout.setDividerDrawable(ContextCompat.getDrawable(this, R.mipmap.fg));

    //只进入一次,初始化
    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);

    //设置默认选中页,宏定义
    tabLayout.getTabAt(ItemWhat).select();
    viewPager.setOffscreenPageLimit(3); //设置向左和向右都缓存的页面个数
    //初始化菜单栏显示
    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]);
      //设置不可点击
      // mTabView.setClickable(true);

      //更改选中项样式
      if(i==ItemWhat){
        mTabIcon.setImageResource(Limgn[i]);
        mTabText.setTextColor(ContextCompat.getColor(this, R.color.colorRed));
      }

      //设置样式
      tabLayout.getTabAt(i).setCustomView(view);
    }
    //是否选中监听
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
      @Override
      public void onTabSelected(TabLayout.Tab tab) {
       //选中时进入,改变样式
        ItemSelect(tab);
        //onTabselected方法里面调用了viewPager的setCurrentItem 所以要想自定义OnTabSelectedListener,也加上mViewPager.setCurrentItem(tab.getPosition())就可以了
        viewPager.setCurrentItem(tab.getPosition());
      }
      @Override
      public void onTabUnselected(TabLayout.Tab tab) {
       //未选中进入,改变样式
        ItemNoSelect(tab);
      }
      @Override
      public void onTabReselected(TabLayout.Tab tab) {
       //重新选中

      }
    });}
  //某个项选中,改变其样式
  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]);
      }
    }
  }
  //某个项非选中,改变其样式
  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]);
      }
    }
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • TabLayout关联ViewPager后不显示文字的解决方法

    当使用addTab()方法给tablayout动态添加文字时可能会出现不显示标题文字的问题,而真实情况并不是不显示文字,而是ViewPager又给TabLayout加了许多空的标题,导致之前手动添加的标题被挤到后面,不信你多往后翻一翻是不是就出来了.那么这些空的标题是如何产生的呢,通过分析TabLayout源码很快就查出这个问题,其中有个方法的代码是这样的: private void populateFromPagerAdapter() { removeAllTabs(); if (mPager

  • TabLayout实现ViewPager指示器的方法

    在TabLayout出现之前,基本都是通过 ViewPager+FragmentPagerAdapter+第三方开源tab指示器(TabPageIndicator)来实现的.现在Android内部提供了现成的TabLayout控件来实现ViewPager指示器的效果. 先看效果图: 导入依赖 在Gradle文件中导入依赖,代码如下: compile 'com.android.support:design:23.4.0' TabLayout类就在这个依赖包中定义的. 布局文件中使用 <Linear

  • Android中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的. 更多说明可参考官方文档

  • Android 中基于TabLayout+ViewPager实现标签卡效果

    代码已经上传至Github:https://github.com/YanYoJun/ViewPagerDemo 先看效果 1.布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.andro

  • Android中TabLayout+ViewPager实现tab和页面联动效果

    TabLayout+ViewPager实现tab和页面联动效果 xml中: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" an

  • Android中TabLayout结合ViewPager实现页面切换效果

    先看看效果,如图: 1.因为TabLayout是Android Design Support Library官方库的一个控件,所以使用TabLayout时候需要先添加对该库的依赖 compile 'com.android.support:design:22.2.0' 2.下面是TabLayout和ViewPager配合使用的布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns

  • Android中TabLayout+ViewPager 简单实现app底部Tab导航栏

    前言 在谷歌发布Android Design Support Library之前,app底部tab布局的实现方法就有很多种,其中有RadioGroup+FrameLayout.TabHost+Fragment.FragmentPagerAdapter+ViewPager等方法,虽然这些方法虽然能达到同样的效果,但我个人总觉得有些繁琐.然而,Google在2015的IO大会上,给开发者们带来了全新的Android Design Support Library,里面包含了许多新控件,这些新控件有许多

  • AndroidUI组件SlidingTabLayout实现ViewPager页滑动效果

    使用SlidingTabLayout需要准备2个类,分别是 SlidingTabLayout,与SlidingTabStrip,,放进项目中时只用修改下包名即可. 效果制作的不是很好. 这篇文章,也是在网上搜了很多资源参考,对 SlidingTabLayout.java和SlidingTabStrip.java进行了修改.大家可以更改他的格式字体大小.选中状态,分割线调整等等.先上传这两个文件,改动支出都做了注释. SlidingTabLayout.java /* * Copyright (C)

  • TabLayout+ViewPager实现切页的示例代码

    安卓使用TabLayout+ViewPager+Fragment 实现页面切换,可实现左右滑动切换视图界面和点击切换 可自定义菜单栏是在顶部还是在底部 一.实现效果: 二.实现过程: 2.1 一些重要的设置 添加必须依赖: 因为需要使用:import android.support.design.widget.TabLayout;,所以必须添加下列依赖 compile 'com.android.support:design:23.3.0' 主布局文件编写: 顶部或者底部显示,只要更改ViewPa

  • jsp实现上一页下一页翻页功能(示例代码)

    前段时间一直忙于期末考试和找实习,好久没写博客了. 这段时间做了个小项目,包含了翻页和富文本编辑器Ueditor的两个知识点,Ueditor玩的还不是很深,打算玩深后再写篇博客. 要实现翻页功能,只需要设置一个pageIndex即可,然后每次加载页面时通过pageIndex去加载数据就行. 那么我们可以设置一个隐藏的input框,用于传递pageIndex给下个页面. 当我们点击上一页的时候,通过js方法改变pageIndex的值,再提交表单即可 二话不多说,看代码,代码里面写的还算比较清楚.

  • layui点击导航栏刷新tab页的示例代码

    layui的tab也默认是切换,不会刷新,想要达到点击导航栏刷新tab的功能只需在tab.js文件中将autoRefresh: false,改为true. 以上这篇layui点击导航栏刷新tab页的示例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Django实现翻页的示例代码

    Django提供了翻页器.用Django的Paginator类实现 一.views模块导入Paginator类实现数据分页 ApiTest/apiviews.py 每行都加了注释,希望有助于理解. from django.shortcuts import render from ApiTest.models import ApiTest from django.contrib.auth.decorators import login_required from django.core.pagin

  • Vue实现未登录跳转到登录页的示例代码

    1.登录页登录成功时将服务端返回的标识存放起来 2.在router中给不需要登录的页面设置 meta : { auth : false },如首页 3.使用路由前置守卫beforEach,由于给路由设置了meta : { auth : false },如果是符合该属性时则不需要跳转登录页 4.接下来根据token是否存入到localstorage来进行判断或者cookie是否存入客户端做判断,这里在vuex中做处理 如果token和cookie不存在时则需要跳转到登录页 5.在axios中响应拦

  • 封装的jquery翻页滚动(示例代码)

    HTML结构: 复制代码 代码如下: ul._rollSe{width:100px;height:300px;over-flow:hidden}  ul._rollSe li._rollPar{height:100px;border:1px solid #369} 复制代码 代码如下: <div class="_rollParent">  <ul class="_rollPageSe">  <li class="_rollpa

  • Android 仿京东、拼多多商品分类页的示例代码

    最近接了一个项目,要仿照京东写一个商品分类页,但需要滑动右边子分类,左边的主分类也跟着变换,写了个demo,需要的同学可以自取. 先放一个写完之后的样子: 写这个需求的思路也很清晰,首先左边肯定是一个listView,右边也是一个listView,这两个listView要达到一个联动的效果.右边的listView再嵌套一个GridView即可.如下图所示. 所以,我们需要的数据结构也就确定了,应该是数组套数组,也就说护肤大分类下又有子分类商品,类似于这个样子: ok,数据和UI结构确定了,就可以

  • Flutter实现用视频背景的登录页的示例代码

    最终效果 项目地址 https://github.com/Tecode/flutter_widget 实现方法 安装插件 安装video_player,我安装的是最新的版本,请根据你自己的flutter版本去安装对应的版本,安卓可以直接使用虚拟机,IOS需要真机才可以播放. dev_dependencies: flutter_test: sdk: flutter video_player: ^0.10.1+6 我的Flutter版本 Flutter 1.7.8+hotfix.4 • channe

  • vue2.0+vue-router构建一个简单的列表页的示例代码

    一: 环境搭建 使用vue-cli脚手架工具构建 安装 vue-cli npm install -g vue-cli 使用vue-cli初始化项目 vue init demo1 进到目录 cd demo1 安装依赖 npm install 开始运行 npm run dev 浏览器访问http://localhost:8080 1.首先会打开首页 也就是我们看到的index.html文件 2.使用webpack打包之后默认加载main.js文件并将其引入到index.html文件中 二: 开发 在

  • Android中TabLayout添加小红点的示例代码

    本文介绍了Android中TabLayout添加小红点的示例代码,分享给大家,具体如下 安卓原生的android.support.design.widget.TabLayout,配合ViewPager已经很好用了,但是有时我们会在内容更新时,在tab标题右上方加上一个红点等标记此tab内容有更新时,就需要给原生的TabLayout设置你定义的布局,用法和原生的一样,只是在代码中设置一下TabLayout的布局. 1.主布局文件 <?xml version="1.0" encodi

随机推荐