1.TabLayout介绍

  TabLayout提供了一个水平的布局用来展示Tabs,很多应用都有这样的设计,典型的有网易新闻,简书,知乎等。TabLayout就可以很好的完成这一职责,首先TabLayout一般都是配合Viewpager使用的,Viewpager里的Fragment随着顶部的Tab一起联动,这种场景再熟悉不过了。

注意:了解开源框架MagicIndicator,也能实现顶部菜单栏的功能。

参考文献:https://blog.csdn.net/qq_24956515/article/details/51871238

2.实现方法

(1)design模式下,将TabLayout 拖入界面中

注意:TabLayout 在container中

(2)design模式下,将ViewPager拖入界面中

<1>若出现错误(在xml文件中设置android:orientation="vertical")

<2>向viewpager中添加页面组件

(1)创建多个页面

app--->res--->layout ,选中layout,右击new--->xml--->layout xml file

(2)将多个页面布局添加到Viewpager中(采用Fragment的方式)

新建3个MyFragment(继承Fragment)

注意:View类的介绍:在Activity显示的控件 都叫做View(View类 是所有的控件类的父类 比如 文本 按钮)

3.源码

<1>页面XML文件布局

(1)主页面

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. tools:context=".MainActivity">
  9.  
  10. <android.support.design.widget.TabLayout
  11. android:id="@+id/tablayout"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content">
  14. </android.support.design.widget.TabLayout>
  15.  
  16. <android.support.v4.view.ViewPager
  17. android:id="@+id/viewpager"
  18. android:layout_width="match_parent"
  19. android:layout_height="match_parent" />
  20. </LinearLayout>

(2)fragment页面1布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:gravity="center">
  6.  
  7. <TextView
  8. android:id="@+id/textView"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:text="新闻页面"
  12. android:textSize="30dp" />
  13. </LinearLayout>

(3)fragment页面2布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:gravity="center"
  5. android:layout_height="match_parent">
  6.  
  7. <Button
  8. android:id="@+id/button"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:text="Button" />
  12. </LinearLayout>

(4)fragment页面3布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:gravity="center"
  6. android:layout_height="match_parent">
  7.  
  8. <ImageView
  9. android:id="@+id/imageView"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. app:srcCompat="@mipmap/ic_launcher" />
  13. </LinearLayout>

<2>后台代码

(1)MainActivity.java

  1. package com.lucky.test11;
  2.  
  3. import android.support.annotation.Nullable;
  4. import android.support.design.widget.TabLayout;
  5. import android.support.v4.app.Fragment;
  6. import android.support.v4.app.FragmentManager;
  7. import android.support.v4.app.FragmentPagerAdapter;
  8. import android.support.v4.view.ViewPager;
  9. import android.support.v7.app.AppCompatActivity;
  10. import android.os.Bundle;
  11.  
  12. import java.util.ArrayList;
  13. import java.util.List;
  14.  
  15. public class MainActivity extends AppCompatActivity {
  16. TabLayout tabLayout;
  17. ViewPager viewPager;
  18. List<Fragment> fragments; //定义一个列表集合(应用泛型)
  19. String[] table={"新闻","财经","娱乐"}; //定义一个数组存放标题内容
  20.  
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_main);
  25. tabLayout=findViewById(R.id.tablayout);
  26. viewPager=findViewById(R.id.viewpager);
  27. fragments=new ArrayList<>(); //实例化集合
  28. fragments.add(new MyFragment1());
  29. fragments.add(new MyFragment2());
  30. fragments.add(new MyFragment3());
  31.  
  32. Adapter adapter=new Adapter(getSupportFragmentManager(),fragments); //参数1为fragment管理器
  33. viewPager.setAdapter(adapter); //给viewPager设置适配器
  34. tabLayout.setupWithViewPager(viewPager); //将tabLayout与viewPager建立匹配
  35. }
  36.  
  37. //创建一个内部类作为适配器
  38. public class Adapter extends FragmentPagerAdapter{
  39. private List<Fragment> list;
  40. public Adapter(FragmentManager fm,List<Fragment> list) {
  41. super(fm);
  42. this.list=list;
  43. }
  44.  
  45. @Override
  46. public Fragment getItem(int position) {
  47. return list.get(position);
  48. }
  49.  
  50. @Override
  51. public int getCount() {
  52. return list.size();
  53. }
  54.  
  55. //重写getPageTitle()方法,获取页标题
  56. @Nullable
  57. @Override
  58. public CharSequence getPageTitle(int position) {
  59. return table[position];
  60. }
  61. }
  62. }

(2)MyFragment1.java

  1. package com.lucky.test11;
  2.  
  3. import android.os.Bundle;
  4. import android.support.annotation.NonNull;
  5. import android.support.annotation.Nullable;
  6. import android.support.v4.app.Fragment;
  7. import android.view.LayoutInflater;
  8. import android.view.View;
  9. import android.view.ViewGroup;
  10.  
  11. public class MyFragment1 extends Fragment {
  12. //将layout_pageq.xml文件与MyFragment1相关联
  13. @Nullable
  14. @Override
  15. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  16. View view=inflater.inflate(R.layout.layout_page1,container,false);
  17. return view;
  18. }
  19. }

(3)MyFragment2.java

  1. package com.lucky.test11;
  2.  
  3. import android.os.Bundle;
  4. import android.support.annotation.NonNull;
  5. import android.support.annotation.Nullable;
  6. import android.support.v4.app.Fragment;
  7. import android.view.LayoutInflater;
  8. import android.view.View;
  9. import android.view.ViewGroup;
  10.  
  11. public class MyFragment2 extends Fragment {
  12. @Nullable
  13. @Override
  14. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  15. View view=inflater.inflate(R.layout.layout_page2,container,false);
  16. return view;
  17. }
  18. }

(4)MyFragment3.java

  1. package com.lucky.test11;
  2.  
  3. import android.os.Bundle;
  4. import android.support.annotation.NonNull;
  5. import android.support.annotation.Nullable;
  6. import android.support.v4.app.Fragment;
  7. import android.view.LayoutInflater;
  8. import android.view.View;
  9. import android.view.ViewGroup;
  10.  
  11. public class MyFragment3 extends Fragment {
  12. @Nullable
  13. @Override
  14. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  15. View view=inflater.inflate(R.layout.layout_page3,container,false);
  16. return view;
  17. }
  18. }

4.效果图

源码:test11

5.使用案例二

本案例特点:根据网络请求返回的数据,自动生成tablayout中所要呈现的菜单项。

(1)NewsCenterFragment.java

  1. package com.example.administrator.test66smartbeijing.fragment;
  2.  
  3. import android.os.Bundle;
  4. import android.support.annotation.NonNull;
  5. import android.support.annotation.Nullable;
  6. import android.support.design.widget.TabLayout;
  7. import android.support.v4.app.Fragment;
  8. import android.support.v4.app.FragmentManager;
  9. import android.support.v4.app.FragmentPagerAdapter;
  10. import android.support.v4.view.PagerAdapter;
  11. import android.support.v4.view.ViewPager;
  12. import android.text.TextUtils;
  13. import android.view.LayoutInflater;
  14. import android.view.View;
  15. import android.view.ViewGroup;
  16.  
  17. import com.alibaba.fastjson.JSONObject;
  18. import com.example.administrator.test66smartbeijing.R;
  19. import com.example.administrator.test66smartbeijing.javabean.NewsMenu;
  20. import com.example.administrator.test66smartbeijing.utils.CacheUtils;
  21. import com.example.administrator.test66smartbeijing.utils.ConstantValue;
  22.  
  23. import org.xutils.common.Callback;
  24. import org.xutils.http.RequestParams;
  25. import org.xutils.x;
  26.  
  27. /**
  28. * 利用tabLayout+viewPager实现带顶部菜单栏的fragment
  29. */
  30. public class NewsCenterFragment extends Fragment {
  31. private TabLayout tabLayout = null;
  32. private ViewPager viewPager;
  33. private Fragment[] mFragmentArrays;
  34. private String[] mTabTitles;
  35. String queryResultStr="";
  36. NewsMenu newsMenu;
  37.  
  38. @Nullable
  39. @Override
  40. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  41. View view=inflater.inflate(R.layout.layout_fm_newscenter,container,false);
  42. tabLayout = view.findViewById(R.id.tablayout);
  43. viewPager = view.findViewById(R.id.tab_viewpager);
  44. initView();
  45. return view;
  46. }
  47.  
  48. private void initView() {
  49. //判断有没有缓存,如果有的话,加载缓存,没有的话,请求网络数据
  50. String cache=CacheUtils.getCache(ConstantValue.CATEGORY_URL,getActivity());
  51. if(!TextUtils.isEmpty(cache)){
  52. System.out.println("发现缓存");
  53. newsMenu = processData(cache);
  54.  
  55. }else {
  56. getDataFromServer();
  57. newsMenu =processData(queryResultStr);
  58. }
  59. System.out.println(newsMenu);
  60. System.out.println(newsMenu.data.get(0).children.size());
  61. mTabTitles = new String[newsMenu.data.get(0).children.size()]; //放置标题的数组
  62.  
  63. for (int i = 0; i <mTabTitles.length ; i++) {
  64. mTabTitles[i]=newsMenu.data.get(0).children.get(i).title;
  65. }
  66.  
  67. //tabLayout.setTabMode(TabLayout.MODE_FIXED);
  68. //设置tablayout距离上下左右的距离
  69. //tab_title.setPadding(20,20,20,20);
  70. tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); //设置tablayout为滚动模式
  71. mFragmentArrays = new Fragment[mTabTitles.length];
  72.  
  73. for (int i = 0; i <mTabTitles.length ; i++) {
  74. mFragmentArrays[i] = TabFragment.newInstance();
  75. }
  76. PagerAdapter pagerAdapter = new MyViewPagerAdapter(getActivity().getSupportFragmentManager());
  77. viewPager.setAdapter(pagerAdapter); //给viewPager设置适配器
  78. tabLayout.setupWithViewPager(viewPager);//将ViewPager和TabLayout绑定
  79. }
  80.  
  81. final class MyViewPagerAdapter extends FragmentPagerAdapter {
  82. public MyViewPagerAdapter(FragmentManager fm) {
  83. super(fm);
  84. }
  85.  
  86. //抽象方法必须重写(即子类必须实现父类的抽象方法)
  87. @Override
  88. public Fragment getItem(int position) {
  89. return mFragmentArrays[position];
  90. }
  91.  
  92. @Override
  93. public int getCount() {
  94. return mFragmentArrays.length;
  95.  
  96. }
  97.  
  98. @Override
  99. public CharSequence getPageTitle(int position) {
  100. return mTabTitles[position]; //获取页标题
  101. }
  102. }
  103.  
  104. /**
  105. * 从服务器获取数据
  106. */
  107. private void getDataFromServer() {
  108. //请求地址
  109. String url=ConstantValue.CATEGORY_URL;
  110. RequestParams params = new RequestParams(url);
  111. x.http().get(params, new Callback.CommonCallback<String>() {
  112. @Override
  113. public void onSuccess(String result) {
  114. //解析result
  115. queryResultStr=result;
  116. System.out.println(result);
  117.  
  118. //写缓存
  119. CacheUtils.setCache(ConstantValue.CATEGORY_URL,queryResultStr,getActivity());
  120. }
  121. //请求异常后的回调方法
  122. @Override
  123. public void onError(Throwable ex, boolean isOnCallback) {
  124. }
  125. //主动调用取消请求的回调方法
  126. @Override
  127. public void onCancelled(CancelledException cex) {
  128. }
  129. @Override
  130. public void onFinished() {
  131. }
  132. });
  133.  
  134. }
  135.  
  136. private NewsMenu processData(String queryResultStr) {
  137. // 复杂json格式字符串到JavaBean对象的转换
  138. NewsMenu newsMenu = JSONObject.parseObject(queryResultStr,NewsMenu.class);
  139. return newsMenu;
  140. }
  141. }

(2)TabFragment.java

  1. package com.example.administrator.test66smartbeijing.fragment;
  2.  
  3. import android.os.Bundle;
  4. import android.support.annotation.Nullable;
  5. import android.support.v4.app.Fragment;
  6. import android.support.v7.widget.LinearLayoutManager;
  7. import android.support.v7.widget.RecyclerView;
  8. import android.view.LayoutInflater;
  9. import android.view.View;
  10. import android.view.ViewGroup;
  11.  
  12. import com.example.administrator.test66smartbeijing.R;
  13. import com.example.administrator.test66smartbeijing.utils.RecyclerAdapter;
  14.  
  15. /**
  16. * Created by zq on 2017/1/12.
  17. */
  18. public class TabFragment extends Fragment {
  19.  
  20. //新建一个Fragment实例
  21. public static Fragment newInstance() {
  22. TabFragment fragment = new TabFragment();
  23. return fragment;
  24. }
  25. @Nullable
  26. @Override
  27. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  28. // LayoutInflater.inflate()的功能是将一段 XML 资源文件加载成为 View。所以通常用于将 XML 文件实例化为 View。然后获取 View 上的组件最后操作之。
  29. View rootView = inflater.inflate(R.layout.fragment_tab, container, false);
  30. RecyclerView recyclerView = rootView.findViewById(R.id.recycler); //获取recyclerView这个组件
  31. LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
  32. layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
  33. recyclerView.setLayoutManager(layoutManager); //给recyclerView设置布局管理器
  34. recyclerView.setAdapter(new RecyclerAdapter()); //给recyclerView设置适配器
  35. return rootView;
  36. }
  37. }

(3)RecyclerAdapter.java

  1. package com.example.administrator.test66smartbeijing.utils;
  2.  
  3. import android.support.v7.widget.RecyclerView;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.TextView;
  8.  
  9. import com.example.administrator.test66smartbeijing.R;
  10.  
  11. /**
  12. * Created by zq on 2017/1/12.
  13. */
  14. public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.AuthorViewHolder> {
  15.  
  16. @Override
  17. public AuthorViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  18. LayoutInflater inflater = LayoutInflater.from(parent.getContext());
  19. View childView = inflater.inflate(R.layout.item, parent, false);
  20. AuthorViewHolder viewHolder = new AuthorViewHolder(childView);
  21. return viewHolder;
  22. }
  23.  
  24. @Override
  25. public void onBindViewHolder(AuthorViewHolder holder, int position) {
  26. }
  27.  
  28. @Override
  29. public int getItemCount() {
  30. return 15;
  31. }
  32.  
  33. class AuthorViewHolder extends RecyclerView.ViewHolder {
  34.  
  35. TextView mNickNameView;
  36. TextView mMottoView;
  37. public AuthorViewHolder(View itemView) {
  38. super(itemView);
  39. mNickNameView = itemView.findViewById(R.id.tv_nickname);
  40. mMottoView = itemView.findViewById(R.id.tv_motto);
  41. }
  42. }
  43. }

(4)效果图

011 Android TabLayout+ViewPager实现顶部滑动效果(多个页面)的更多相关文章

  1. [置顶] xamarin Tablayout+Viewpager+Fragment顶部导航栏

    最近几天不忙,所以把项目中的顶部导航栏的实现归集一下.android中使用TabLayout+ViewPager+Fragment制作顶部导航非常常见,代码实现也比较简单.当然我这个导航栏是基于xam ...

  2. Android 利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果

    本文主要介绍如何利用ViewPager.Fragment.PagerTabStrip实现多页面滑动效果.即google play首页.新浪微博消息(at.评论.私信.广播)页面的效果.ViewPage ...

  3. Android TabLayout+ViewPager禁止滑动

    1.重写ViewPager并重写覆盖ViewPager的onInterceptTouchEvent(MotionEvent arg0)方法和onTouchEvent(MotionEvent arg0) ...

  4. [Android]使用ViewPager实现图片滑动展示

    在淘宝等电商的APP首页经常能看到大幅的广告位,通常有多幅经常更新的图片用于展示促销信息,如下图所示: 通常会自动滚动,也可以根据手势滑动.我没有研究过人家的APP是通过什么实现的,可能有第三方已经封 ...

  5. 114、Android禁止ViewPager的左右滑动

    有时候在开发中会遇到一些“诡异”的要求,比如在ViewPager中嵌入ListView,或者再嵌入一个ViewPager,那么在滑动的时候就会造成被嵌入的XXView不能滑动了,那么现在就把最外层的V ...

  6. Android实现多页左右滑动效果,支持子view动态创建和cache

    要实现多页滑动效果,主要是需要处理onTouchEvent和onInterceptTouchEvent,要处理好touch事件的子控件和父控件的传递问题. 滚动控制可以利用android的Scroll ...

  7. Android listview viewpager解决冲突 滑动

    Android listview viewpager滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决   在listview 上使用 addHeaderView 在第 ...

  8. Android禁止ViewPager的左右滑动

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/40744287 有时候在开发中会遇到一些"诡异"的要求,比方在V ...

  9. android SlidingTabLayout实现ViewPager页卡滑动效果

    先来张效果图(能够滑动切换页卡) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGVuZ2t2/font/5a6L5L2T/fontsize/400/fi ...

随机推荐

  1. js中 visibility和display的区别 js中 visibility和display的区别

    大多数人很容易将CSS属性display和visibility混淆,它们看似没有什么不同,其实它们的差别却是很大的. visibility属性用来确定元素是显示还是隐藏,这用visibility=&q ...

  2. java用JDBC连接数据库的方式

    //驱动位置String sDBDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";//连接数据库地址名字String ...

  3. 模板模式和Comparable类

    模板模式中,父类规定好了一些算法的流程,并且空出一些步骤(方法)留给子类填充 Java的数组类中静态方法sort()就是一个模板,它空出了一个compareTo的方法,留给子类填充,用来规定什么是大于 ...

  4. Charles安装证书ssl proxying

    1.找到工具栏上方的 help 按钮 2.help下面有一个 ssl proxying的选项,点击ssl proxying 选择里面的第三个:install charles root certific ...

  5. 编写高质量代码改善C#程序的157个建议——建议58:用抛出异常代替返回错误代码

    建议58:用抛出异常代替返回错误代码 CLR异常机制的优点: 正常控制流会被立即中止,无效值或状态不会在系统中继续传播. 提供了统一的处理错误的方法. 提供了在构造函数.操作符重载及属性中报告异常的遍 ...

  6. 编写高质量代码改善C#程序的157个建议——建议36:使用FCL中的委托声明

    建议36:使用FCL中的委托声明 FCL中存在3类这样的委托声明,它们分别是:Action.Func.Predicate.尤其是在它们的泛型版本出来以后,已经能够满足我们在实际编码过程中的大部分需求. ...

  7. cmake笔记

    注:cmake .   当前文件夹(一个点)   cmake .. 父目录(两个点) 例子一 一个经典的C程序,如何用cmake来进行构建程序呢? //main.c #include <stdi ...

  8. 异步 Action 的定义

    ASP.NET MVC 3中的异步 Action 通过两个匹配的方法XxxAsync/XxxCompleted 来定义,这样的异步 Action 只能定义在继承自 AsyncConoller 的类型中 ...

  9. Oracle排序函數Rank

    出口給報關行出貨的時候,同一票shipment中合併多個invoice跟packing,轉出到廠商的報關系統時候,出口報關的序號會將invoice的序號做自動增加. 因為wafer會有出口給其他外包做 ...

  10. 关于eWebEditorAPI

    1.获取HTML document.getElementById(Iframe的名称).contentWindow.getHTML();在线API http://www.ewebeditor.net/ ...