文档章节

使用tablayout 打造高度不一样的tab

java9
 java9
发布于 2016/03/02 10:18
字数 802
阅读 1398
收藏 3
点赞 2
评论 1

要实现下图这样的效果,请忽略红线。


本人的实现综指是以最少的代码来实现。

每一个tab使用自定义view.每个tab是由两个控件叠加的。没有选中的时候下面一层的背景为透明,选中的时候下面一层的背景为放大效果的图片。tab的上面一层的背景为白色。

tabLayout.setupWithViewPager(mViewPager);
for (int i = 0; i < tabLayout.getTabCount(); i++) {
    TabLayout.Tab tab = tabLayout.getTabAt(i);
    if(tab==null){
        continue;
    }
    View view = mSectionsPagerAdapter.getTabView(this,i);
    tab.setCustomView(view);
}

adapter

public class SectionsPagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> mFragments = new ArrayList<>();
    private int[] imageResId = {
            R.drawable.bottom_button_index,
            R.drawable.bottom_button_study,
            R.drawable.bottom_button_activity,
            R.drawable.bottom_button_my
    };//图片资源
    private int[] titleResId = {
            R.string.bottom_button_index,
            R.string.bottom_button_study,
            R.string.bottom_button_activity,
            R.string.bottom_button_my
    };//标题资源
    public SectionsPagerAdapter(FragmentManager fm,Fragment... fragments) {
        super(fm);
        mFragments.addAll(Arrays.asList(fragments));
    }

    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

    @Override
    public int getCount() {
        // Show 3 total pages.
        return 4;
    }

    //加载自定义布局
    View getTabView(Context context, int position){
        View view = LayoutInflater.from(context).inflate(R.layout.bottom_button,null);
        ((ImageView) view.findViewById(R.id.bottom_button_img)).setImageDrawable(context.getResources().getDrawable(imageResId[position]));
        ((TextView) view.findViewById(R.id.bottom_button_title)).setText(context.getResources().getString(titleResId[position]));
        return view;
    }
}

每个tab的布局

<LinearLayout 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"
    android:background="@drawable/bottom_button"
    android:orientation="vertical">
<!--外层的LinearLayout即为下面一层的放大区域,选中时设置放大的背景图。当然也可以用FrameLayout。里层的LinearLayout为按钮,背景为白色,选中时背景为绿色。
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="@dimen/tab_height_limit"//这里需要给放大的区域留一个空间,不然看不到放大的效果
        android:orientation="vertical"
        android:background="@drawable/bottom_button2">

        <ImageView
            android:id="@+id/bottom_button_img"
            android:layout_width="@dimen/tab_img_width"
            android:layout_height="@dimen/tab_img_width"
            android:layout_gravity="center_horizontal"
            android:scaleType="fitCenter"
            tools:src="@drawable/bottom_button_index" />

        <TextView
            android:id="@+id/bottom_button_title"
            android:layout_width="match_parent"
            android:layout_height="@dimen/bottom_btn_text_height"
            android:layout_gravity="bottom"
            android:gravity="bottom|center_horizontal"
            tools:text="@string/bottom_button_index" />
    </LinearLayout>
</LinearLayout>

外层的图片bottom_button.xml,选中时是放大的图片,不选中时是透明的

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/tab_selected_bg" android:state_selected="true" />
    <item android:drawable="@android:color/transparent" />
</selector>

里层的背景图片botton_button2.xml,选中时是透明的,不选中时白色的。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/white" android:state_selected="false"  />
    <item android:drawable="@android:color/transparent" android:state_selected="true"  />
</selector>

这样就基本上实现了上述功能。不过你会发现第一个tab最开始是没有这种效果的。

不管你是设置

android:state_...="true"

还是实现tabselectlistener,去手动更改背景图片也好。效果都不理想。

由此我在想 android:state_selected =true 是如何工作的?怎么样才叫selected? 

最终我发现view中有一个方法叫setSelected(true),通过以下代码使第一个tab刚开始时实现我们的效果。

if (tabLayout.getSelectedTabPosition() == 0){
    tabLayout.getTabAt(0).getCustomView().setSelected(true);
}

由此不得不吐槽一下,既然 tabLayout.getSelectedTabPosition()==0,为啥还要我手动去设置selected效果。

还有viewpager刚开始时,也就是最初显示viewpager时也不触发onpageselected事件。就算你设置setcurrentitem(0)也没有用,因为现在就是显示的就是第0页。

最后再提一点就是,如果设置了tablayout的ontabselectedlistener,你会发现点击tab之后,viewpager不切换了,看一下源代码就知道为什么了。


© 著作权归作者所有

共有 人打赏支持
java9
粉丝 12
博文 65
码字总数 25460
作品 0
武汉
后端工程师
加载中

评论(1)

钢笔布莱恩特
钢笔布莱恩特
源码呢,
关于Android改变TabLayout 下划线(Indicator)宽度实践总结

TabLayout我们再熟悉不过了,在开发中,像这种tab切换的需求都会用到TabLayout,它是由官方提供的一个控件,在support design 包中。使用起来非常简单方便,交互效果也很不错,能满足我们开发...

依然范特稀西 ⋅ 06/03 ⋅ 0

Andorid - Material Design之TabLayout

老婆保佑,代码无BUG 前言 Material Design 系列第四篇 TabLayout 目录 一:使用 二:属性介绍 三:与ViewPager一起使用 引用 Untitled.gif 一:使用 1. 静态设置 2. 动态设置 二:属性介绍 ...

Allens_Jiang ⋅ 01/02 ⋅ 0

Android Material风格的应用(一)--AppBar TabLayout

打造Material风格的Android应用 Android Material风格的应用(一)--AppBar TabLayout Android Material风格的应用(二)--RecyclerView Android Material风格的应用(三)--DrawerLayout Android......

coderminer ⋅ 2016/11/14 ⋅ 0

垂直的 Android TabLayout 组件--VerticalTabLayout

VerticalTabLayout 是一个垂直竖向的 Android TabLayout。 特性: 支持自定义Indicator大小 支持自定义Indicator位置 支持Indicator设置圆角 支持Tab设置Badge 支持Adapter的方式创建Tab 多种...

匿名 ⋅ 2017/02/11 ⋅ 4

Tablayout使用全解,一篇就够了

前言 Tablayout继承自HorizontalScrollView,用作页面切换指示器,因使用简便功能强大而广泛使用在App中。 但有的产品经理偏偏是个磨人的小妖精,真的猜不透啊,今天要这种效果,明天就指着另...

翻滚吧李博 ⋅ 2017/12/06 ⋅ 0

Android使用TabLayout与ViewPager结合以及TabItem自定义

Android使用TabLayout与ViewPager结合以及TabItem自定义 丛林听雨2017-09-1317 阅读 Android自定义 使用android的design支持包中的android.support.design.widget.TabLayout结合ViewPager/F...

丛林听雨 ⋅ 2017/09/13 ⋅ 0

TabLayout 与 FragmentTabHost

TabLayout 与 FragmentTabHost Android提供实现Tab样式的控件大致有TabActivity、FragmentTabHost、TabLayout。而TabActivity已经过时,这里就不在多说,主要提 一下Tablayout与FragmentTab...

冰色 ⋅ 2016/01/08 ⋅ 0

使用android support library中的tablayout实现页签切换效果出现的问题

Tablayout出现之前,由于google不再推荐使用tabActivity来实现页签切换的效果,或是那种页签切换满足不了我们实际的使用要求,因此出现了第三方的库:PagerSlidingTabStrip,viewpagerindica...

我家有宝 ⋅ 2015/11/24 ⋅ 4

Android深度定制化TabLayout:圆角,渐变色,背景边框,基于Android原生TabLayout

Android深度定制化TabLayout:圆角,渐变色,背景边框,基于Android原生TabLayout 如今UI设计已经不再满足于下方只有一个下划线,切换后能改变和表示选中颜色的TabLayout了。设计对于TabLayo...

zhangphil ⋅ 05/28 ⋅ 0

几行代码,让你的app动感起来--Android Design Support Library使用

目前,我相信,没有任何 Android 开发者不知道材料设计的,因为它的设计在过去的一年震惊了世界,正式的变成了一个设计理念。 令人惊讶的是,在 Android 应用中材料设计是不容易实现的,因为...

iSnowFlake ⋅ 2016/02/14 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

RabbitMQ学习以及与Spring的集成(三)

本文介绍RabbitMQ与Spring的简单集成以及消息的发送和接收。 在RabbitMQ的Spring配置文件中,首先需要增加命名空间。 xmlns:rabbit="http://www.springframework.org/schema/rabbit" 其次是模...

onedotdot ⋅ 24分钟前 ⋅ 0

JAVA实现仿微信红包分配规则

最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。 算法介绍 一、红包金额限制 对于微...

小致dad ⋅ 36分钟前 ⋅ 0

Python 数电表格格式化 xlutils xlwt xlrd的使用

需要安装 xlutils xlwt xlrd 格式化前 格式化后 代码 先copy读取的表格,然后按照一定的规则修改,将昵称中的学号提取出来替换昵称即可 from xlrd import open_workbookfrom xlutils.copy ...

阿豪boy ⋅ 今天 ⋅ 0

面试题:使用rand5()生成rand7()

前言 读研究生这3 年,思维与本科相比变化挺大的,这几年除了看论文、设计方案,更重要的是学会注重先思考、再实现,感觉更加成熟吧,不再像个小P孩,人年轻时总会心高气傲。有1 道面试题:给...

初雪之音 ⋅ 今天 ⋅ 0

Docker Toolbox Looks like something went wrong

Docker Toolbox 重新安装后提示错误:Looks like something went wrong in step ´Checking if machine default exists´ 控制面板-->程序与应用-->启用或关闭windows功能:找到Hyper-V,如果处......

随你疯 ⋅ 今天 ⋅ 0

Guacamole 远程桌面

本文将Apache的guacamole服务的部署和应用,http://guacamole.apache.org/doc/gug/ 该链接下有全部相关知识的英文文档,如果水平ok,可以去这里仔细查看。 一、简介 Apache Guacamole 是无客...

千里明月 ⋅ 今天 ⋅ 0

nagios 安装

Nagios简介:监控网络并排除网络故障的工具:nagios,Ntop,OpenVAS,OCS,OSSIM等开源监控工具。 可以实现对网络上的服务器进行全面的监控,包括服务(apache、mysql、ntp、ftp、disk、qmail和h...

寰宇01 ⋅ 今天 ⋅ 0

AngularDart注意事项

默认情况下创建Dart项目应出现以下列表: 有时会因为不知明的原因导致列表项缺失: 此时可以通过以下步骤解决: 1.创建项目涉及到的包:stagehand 2.执行pub global activate stagehand或pub...

scooplol ⋅ 今天 ⋅ 0

Java Web如何操作Cookie的添加修改和删除

创建Cookie对象 Cookie cookie = new Cookie("id", "1"); 修改Cookie值 cookie.setValue("2"); 设置Cookie有效期和删除Cookie cookie.setMaxAge(24*60*60); // Cookie有效时间 co......

二营长意大利炮 ⋅ 今天 ⋅ 0

【每天一个JQuery特效】淡入淡出显示或隐藏窗口

我是JQuery新手爱好者,有时间就练练代码,防止手生,争取每天一个JQuery练习,在这个博客记录下学习的笔记。 本特效主要采用fadeIn()和fadeOut()方法显示淡入淡出的显示效果显示或隐藏元...

Rhymo-Wu ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部