一、需求

activity + fragment实现tab,并可以滑动切换tab。

需要导入compile 'com.android.support:design:25.3.1'

二、layout实现

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <android.support.v4.view.ViewPager
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"/> <TextView
android:id="@+id/intervalText1"
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/colorTextDivider"/> <android.support.design.widget.TabLayout
android:id="@+id/tablayout"
android:layout_width="match_parent"
android:layout_height="@dimen/dimen_tab_height"
app:tabMaxWidth="0dp"
app:tabGravity="fill"
app:tabMode="fixed"
app:tabIndicatorColor="@color/primary"
app:tabIndicatorHeight="@dimen/dimen_line"/> </LinearLayout>

三、activity + fragment

1、activity实现

public class MainActivity extends AppCompatActivity {

    private static final String TAB_TITLE_SALE = "SALE";
private static final String TAB_TITLE_CART = "CART";
private static final String TAB_TITLE_REPORT = "REPORT";
private static final String TAB_TITLE_SETUP = "SETUP"; private static final String TAB_TITLE = "TAB_TITLE";
private static final String TAB_IMAGE = "TAB_IMAGE"; private List<Map<String, Object>> tabResourcesList = new ArrayList<>();
private List<Fragment> fragments; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initData();
initFragment();
initView();
} /**
* 初始化跟ViewPager、TabLayout中数据有关的数据
*/
private void initData() {
// 初始化Tablayout中展示的标题
addTabResources(TAB_TITLE_SALE, R.drawable.tab_sale);
addTabResources(TAB_TITLE_CART, R.drawable.tab_cart);
addTabResources(TAB_TITLE_REPORT, R.drawable.tab_report);
addTabResources(TAB_TITLE_SETUP, R.drawable.tab_setup);
} private void addTabResources(String title, Integer image) {
Map<String, Object> map = new HashMap<>();
map.put(TAB_TITLE, title);
map.put(TAB_IMAGE, image);
tabResourcesList.add(map);
} private void initFragment() {
// 初始化Fragment集合
fragments = new ArrayList<>();
SaleFragment saleFragment = new SaleFragment();
fragments.add(saleFragment);
CartFragment cartFragment = new CartFragment();
fragments.add(cartFragment);
ReportFragment reportFragment = new ReportFragment();
fragments.add(reportFragment);
SetupFragment setupFragment = new SetupFragment();
fragments.add(setupFragment);
} private void initView() {
TabLayout tabs = (TabLayout) findViewById(R.id.tablayout);
ViewPager viewPager = (ViewPager) findViewById(R.id.vp); CustomPagerAdapter customPagerAdapter = new CustomPagerAdapter(getSupportFragmentManager(), fragments);
viewPager.setAdapter(customPagerAdapter);
tabs.setupWithViewPager(viewPager);
// TabLayout中Tab的排列方式,FIXED表示平分布局;SCROLLABLE表示线性排列,可滑动
tabs.setTabMode(TabLayout.MODE_FIXED); for (int i = 0; i < tabResourcesList.size(); i++) {
tabs.getTabAt(i).setCustomView(getTabView(tabResourcesList.get(i).get(TAB_TITLE).toString(),
tabResourcesList.get(i).get(TAB_IMAGE).hashCode()));
}
} private View getTabView(String title, int resId) {
View newTabView = LayoutInflater.from(this).inflate(R.layout.tab_item_view, null);
ImageView tabIcon = (ImageView) newTabView.findViewById(R.id.tabIcon);
tabIcon.setImageResource(resId);
TextView tabTitle = (TextView) newTabView.findViewById(R.id.tabText);
tabTitle.setText(title);
return newTabView;
}
}

2、适配器的实现

实现activity和fragment的绑定。

public class CustomPagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments;

    public CustomPagerAdapter(FragmentManager fragmentManager, List<Fragment> fragments) {
super(fragmentManager);
this.fragments = fragments;
} @Override
public int getCount() {
return fragments.size();//页卡数
} @Override
public Fragment getItem(int position) {
return fragments.get(position);
}
}

3、fragment实现

每次切换tab刷新界面,定义了BaseFragment,避免重复代码。

定义了四个fragment继承BaseFragment,四个fragment对应四个不同的layout文件。

 

public abstract class BaseFragment extends Fragment {

    protected View rootView;
protected boolean isVisible;
private boolean isReady = false; @Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (rootView == null) {
rootView = inflater.inflate(getLayoutId(), container, false);
isReady = true;
delayLoad();
} // remove rootView from its parent
ViewGroup parent = (ViewGroup) rootView.getParent();
if (parent != null) {
parent.removeView(rootView);
}
return rootView;
} private void delayLoad() {
if (!isReady || !isVisible) {
return;
} initData();
initView(rootView);
setListener();
} @Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
isVisible = true;
delayLoad();
} else {
isVisible = false;
}
} protected abstract int getLayoutId(); protected abstract void initData(); protected abstract void initView(View view); protected abstract void setListener();
}

Android中使用TabLayout实现Tab的更多相关文章

  1. 浅谈TabLayout(ViewPager+Tab联动)

    google发布了的Android Support Design库中提供了TabLayout 通过TabLayout+ViewPager实现导航栏效果,点击Tab ,ViewPager跟随变化,滑动V ...

  2. TabLayout自定义tab,实现多样导航栏

    代码地址如下:http://www.demodashi.com/demo/14660.html 前言 之前有讲过TabLayout的一些知识, TabLayout实现顶部导航(一) TabLayout ...

  3. Android中实时预览UI和编写UI的各种技巧

    一.啰嗦 之前有读者反馈说,你搞这个所谓的最佳实践,每篇文章最后就给了一个库,感觉不是很高大上.其实,我在写这个系列之初就有想过这个问题.我的目的是:给出最实用的库来帮助我们开发,并且尽可能地说明这个 ...

  4. android ------ AndroidX的 Tablayout(com.google.android.material.tabs.TabLayout) 的使用

    前面呢,有写过TabLayout的博客,最近开发用到了AndroidX来解决前面的问题,不要工具类设置下划线的问题了,来总结一下 Android--------TabLayout实现新闻客户端顶部导航 ...

  5. Android 中常见控件的介绍和使用

    1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...

  6. Android中NDK的搭建及简单使用 Android.mk相关介绍 JNI的使用

    Android中NDK的搭建及简单使用: 使用NDK,简述其重要步骤:.搭建NDK环境(作用:用于自动生成jni下的.c对应的so文件)---到Android NDK官网或Android官网下载ndk ...

  7. [转] android 中 任务、进程和线程的区别

    PS: handler的目的是在组件进程中开辟一个线程作为消息的poller,收到消息后可以更新Activity中的控件(特殊的view) 任务.进程和线程     关于Android中的组件和应用, ...

  8. Android中使用开源框架PagerSlidingTabStrip实现导航标题

    此开源框架官网地址:https://github.com/astuetz/PagerSlidingTabStrip 可以理解为配合ViewPager使用的交互式页面指示器控件. 话不多说,先上效果图: ...

  9. 【转】Android中dip(dp)与px之间单位转换

    Android中dip(dp)与px之间单位转换 dp这个单位可能对web开发的人比较陌生,因为一般都是使用px(像素)但是,现在在开始android应用和游戏后,基本上都转换成用dp作用为单位了,因 ...

随机推荐

  1. vim高级工能入门

    一.多文件编辑 1.vim   1.txt  2.txt  3.txt同时打开3个文件在vim缓冲区, 命令模式下输入:n 切换到下一个文件,可以加!:n! 强制切换,之前那个没有保存,仅仅是切换. ...

  2. 19-06 【phpunit和docker】

    phpunit简介 在用PHP做项目的时候,有时候我们需要写一些测试代码,其中可能包含单元测试(比如字符串处理,ip解析,mobile解析等). 我们常用的工具是phpunit,它很方便地帮我们组织测 ...

  3. CentOS7+CDH5.14.0安装CDH错误排查:HBase服务出现 该运行状况测试不良,因为 Service Monitor 未找到活动 Master

    错误:HBase服务出现 该运行状况测试不良,因为 Service Monitor 未找到活动 Master 如果重启服务之后无法排除该问题,请执行如下操作(CM换成自己的版本号): rm -f /o ...

  4. Ubuntu 16.04 安装OpenCV 3.4.3

    cmake过程中可能遇到的问题:1.如果网络不好,出现ippicv_linux_20151201.tgz无法在终端下载的情况,则可以先单独下载 ippicv_linux_20151201.tgz之后, ...

  5. 内网ssh穿透

    公司服务器没有公网IP,只有内网IP,利用自己的阿里云服务器(有公网ip)做ssh内网穿透,使得外网可访问.方法如下: 环境: 公司服务器和阿里云服务器均为 Ubuntu 操作系统, 需要修改阿里云服 ...

  6. MyBatis-Plus学习笔记

    MybatisPlus的全局策略配置 注意:我们写的配置还要加到 MybatisSqlSessionFactoryBean 中 applicationContext.xml <!--定义Myba ...

  7. linux-kernel-4.4 移植 (3) 网卡移植

    开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...

  8. 爬坑记-tomcat 项目启动两次的的解决

    项目就启动了两次,程序倒是正常运行,关键我里边写了个while 循环,不能让它启动两次啊 百度了一下,有人说是tomcat server.xml或者tomcat新建服务的时候设置出了问题 ....最终 ...

  9. mysql 函数介绍

    含义 一组预先编译好的SQL语句集合,可以理解成批处理语句 提高代码的重用性 简化操作 减少了编译次数并且减少了和数据库服务器的连接次数, 提高了效率 区别 : 存储过程:可以有0个返回,也可以有多个 ...

  10. dskinlite(uieasy mfc界面库)使用记录1: schema验证xml

    市场上的MFC第三方库很多,最终选定dskinlite企业版,成熟度比较高,当然价格也略贵. 在2017年仍然使用MFC是有些另类,但特定场景很适用,也适合不愿转型的老程序员. 目前处于学习阶段,欢迎 ...