TabLayout的使用

TabLayout 这个实在Google 2015 年的时候在 Android Support Design 包中包含的之前看过这个控件的使用 但是一直没有机会去用,最近闲的没事想开始积累一些知识所以无意中就使用到了它。下面来看下简单的使用:

以前的时候我相信每个人肯定遇到过顶部菜单栏的问题吧 各种五花八门的解决方案,如下图是我早年坐过的一个项目的功能,之前的实现思路是这样的 先写一个布局的模板 inflate 出来,设置宽高、设置title文字 ,添加到一个Linearlayout布局中,设置点击事件,然后把整个view添加到集合中 循环做单选效果,十分的麻烦而且不能单独的封装,性能又不好 ,不过google出了TabLayout这个控件就统一也简单多了。
这里写图片描述

对于这个效果的实现就可以几行代码就搞定了:
XML布局:

    <android.support.design.widget.TabLayout
        android:id="@+id/tablayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </android.support.design.widget.TabLayout>
    <RelativeLayout
        android:id="@+id/relativelayout"
        android:layout_below="@+id/tablayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#5bdb2c"
        >

    </RelativeLayout>

顶部一个TabLayout下部一个布局就可以了,不过这里一定要注意:布局的设置不要让下方的布局把TabLayout遮盖住我们可以给下方布局添加android:layout_below否则tablayout就点不动了。。。真是经验和教训啊55555,我们还可以设置:
tabIndicatorColor //指示器的颜色。
tabSelectedTextColor //tab选择之后文字的颜色
tabTextColor //默认的tab文字的颜色
tabMode=”fixed” //可以设置Tab的模式 可滑动还是不可滑动

这个Tablayout 还以可以加入 icon 代码如下:

 tabLayout =(TabLayout)findViewById(R.id.tablayout);
        tabLayout.addTab(tabLayout.newTab().setText("头条").setIcon(R.mipmap.ic_launcher),0);
        tabLayout.addTab(tabLayout.newTab().setText("精选").setIcon(R.mipmap.ic_launcher),1);
        tabLayout.addTab(tabLayout.newTab().setText("娱乐").setIcon(R.mipmap.ic_launcher),2);
        tabLayout.addTab(tabLayout.newTab().setText("体育").setIcon(R.mipmap.ic_launcher),3);
        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                Log.i("TAG","onTabSelected Posion:--->"+tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                Log.i("TAG","onTabUnselected Posion:--->"+tab.getPosition());

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                Log.i("TAG","onTabReselected Posion:--->"+tab.getPosition());

            }
        });

addOnTabSelectedListener就不说了一看就知道干啥用的

运行效果图:

这里写图片描述

如果你想让图片在文字的左边 那么得自定义下layout了

        tabLayout.addTab(tabLayout.newTab().setCustomView(R.layout.custom_tab),0);
        tabLayout.addTab(tabLayout.newTab().setCustomView(R.layout.custom_tab),1);
        tabLayout.addTab(tabLayout.newTab().setCustomView(R.layout.custom_tab),2);
        tabLayout.addTab(tabLayout.newTab().setCustomView(R.layout.custom_tab),3);

这里写图片描述

但是大多数我们一般都配合Fragment一起使用 代码如下:

        tabLayout =(TabLayout)findViewById(R.id.tablayout);
        tabLayout.addTab(tabLayout.newTab().setText("title1").setIcon(R.mipmap.ic_launcher),0);
        tabLayout.addTab(tabLayout.newTab().setText("title1").setIcon(R.mipmap.ic_launcher),1);
        tabLayout.addTab(tabLayout.newTab().setText("title1").setIcon(R.mipmap.ic_launcher),2);
        tabLayout.addTab(tabLayout.newTab().setText("title1").setIcon(R.mipmap.ic_launcher),3);
        ViewPager   viewPager=(ViewPager)findViewById(R.id.viewpage);
        viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager()));
        tabLayout.setupWithViewPager(viewPager);

哎呀~我们发现title明明设置了怎么会不见了呢
这里写图片描述

然后我们去源码中寻找原因 tab与viewpage 唯一关联的一句代码是 tabLayout.setupWithViewPager(viewPager);当我们找到这个方法的时候:

 private void populateFromPagerAdapter() {
        removeAllTabs();

        if (mPagerAdapter != null) {
            final int adapterCount = mPagerAdapter.getCount();
            for (int i = 0; i < adapterCount; i++) {
                addTab(newTab().setText(mPagerAdapter.getPageTitle(i)), false);
            }

            // Make sure we reflect the currently set ViewPager item
            if (mViewPager != null && adapterCount > 0) {
                final int curItem = mViewPager.getCurrentItem();
                if (curItem != getSelectedTabPosition() && curItem < getTabCount()) {
                    selectTab(getTabAt(curItem));
                }
            }
        }
    }

removeAllTabs(); 看到了源码 把我们添加的tab去全部移除了,又重新创建了新的tab
for (int i = 0; i < adapterCount; i++) {
addTab(newTab().setText(mPagerAdapter.getPageTitle(i)), false);
}
有点无语但是好歹把原因找到了,有问题就有解决问题的方法, 可以在tabLayout.setupWithViewPager()之后重新设置它的tab这里要注意一点的是
tabLayout.getChildCount() 和tabLayout.getTabCount()

       int  count= tabLayout.getTabCount();
        Log.i("TAG",count+"---count->");
        for (int i=0;i<count;i++){
            TabLayout.Tab tab=tabLayout.getTabAt(i);
            tab.setText("窗前"+i);
            Log.i("TAG",i+"---->");
            tab.setIcon(R.mipmap.ic_launcher);
        }

效果图
这里写图片描述

以下是完整的代码

package view.custom.yyr.com.viewpageindicator;

import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.util.ArrayList;

public class TabLayoutUse extends AppCompatActivity {
    TabLayout  tabLayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tab_layout_use);
        tabLayout =(TabLayout)findViewById(R.id.tablayout);
//        tabLayout.addTab(tabLayout.newTab().setText("title1").setIcon(R.mipmap.ic_launcher),0);
//        tabLayout.addTab(tabLayout.newTab().setText("title1").setIcon(R.mipmap.ic_launcher),1);
//        tabLayout.addTab(tabLayout.newTab().setText("title1").setIcon(R.mipmap.ic_launcher),2);
//        tabLayout.addTab(tabLayout.newTab().setText("title1").setIcon(R.mipmap.ic_launcher),3);
        ViewPager   viewPager=(ViewPager)findViewById(R.id.viewpage);
        viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager()));
        tabLayout.setupWithViewPager(viewPager);
       int  count= tabLayout.getTabCount();
        Log.i("TAG",count+"---count->");
        for (int i=0;i<count;i++){
            TabLayout.Tab tab=tabLayout.getTabAt(i);
            tab.setText("窗前"+i);
            Log.i("TAG",i+"---->");
            tab.setIcon(R.mipmap.ic_launcher);
        }
    }

    class  MyFragmentPagerAdapter  extends FragmentPagerAdapter {
//        ArrayList<String> mTextList = new ArrayList<String>();
        ArrayList<Fragment> mFragmentsList =new ArrayList<Fragment>();

        public MyFragmentPagerAdapter(FragmentManager fm) {
            super(fm);
            initDatas();
        }

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

        @Override
        public int getCount() {
            return mFragmentsList.size();
        }
        //        @Override
//        public CharSequence getPageTitle(int position) {
//            return mTextList.get(position);//页卡标题
//        }
        private void initDatas() {
            for(int i=0;i<4;i++) {
//                mTextList.add("测试--->" + i);
                Fragment  fragment=SimpleFragment.newInstance("Fragmnet" + i);
                mFragmentsList.add(fragment);
            }
        }
    };
}
(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值