美文网首页
Material Design控件使用总结之TabLayout

Material Design控件使用总结之TabLayout

作者: HappyGhh | 来源:发表于2017-12-08 14:41 被阅读0次

    此文同步CSDN:Material Design控件使用总结之TabLayout

    一、TabLayout使用前提

        compile 'com.android.support:design:26.+'
    

    首先要导入依赖,需要注意的是版本一定要和自己support库的版本一致,

    二、使用过程

    一)基本使用

    布局文件:

      <android.support.design.widget.TabLayout
            android:id="@+id/main_tab"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabBackground="@android:color/white"
            app:tabIndicatorColor="@color/colorAccent"
            app:tabSelectedTextColor="@color/colorAccent"
            app:tabTextColor="@android:color/black" />
    
        <android.support.v4.view.ViewPager
            android:id="@+id/main_content"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    

    这个需要解释的就是相关的属性,具体的可以查看官方文档,这里介绍几个常用的

    app:tabIndicatorColor—–>tablayout下划线的颜色

    app:tabIndicatorHeight—–>tablayout下划线的高度,如果不想显示可设置为0

    app:tabTextColor—–>文本颜色

    app:tabSelectedTextColor—–>选中后文本颜色

    app:tabGravity—–>显示的位置 值有center 和fill

    app:tabTextAppearance—–>设置显示字体的大小

    app:tabMode —–>tab的显示方式,fixed填充屏幕如果内容过多会挤掉内容,scrollable内容过多,则可以滑动,内容少,则从左向右排列,不会填充屏幕

    接下来,重要的就是给对应的tab设置不同的viewpager页面内容了,每一个ViewPager的内容都设置为一个Fragment

    public class ContentFragment1 extends Fragment {
    
        public static ContentFragment1 newInstance(int page) {
            ContentFragment1 pageFragment = new ContentFragment1();
            return pageFragment;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_content2, container, false);
            return view;
        }
    
    }
    

    创建ViewPager的适配器, 这里提供了一个公共方法addData()来为viewpager设置数据,也可直接在adapter中设置数据,或者通过构造方法把数据传递过来。当然,也可以把adapter设置为一个内部类

    class TabViewPagerAdapter extends FragmentStatePagerAdapter {
    
        private List<String> titles;
        private List<Fragment> fragments;
    
        public TabViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }
    
        @Override
        public Fragment getItem(int position) {
            return fragments.get(position);
        }
    
        @Override
        public int getCount() {
            return titles.size();
        }
    
        public void addData(List<String> tabList,List<Fragment> fragmentList){
            this.titles = tabList;
            this.fragments = fragmentList;
        }
    //返回Tab的标题,必须重写该方法,否则不显示tab标题
        @Override
        public CharSequence getPageTitle(int position) {
            if (titles != null){
                return titles.get(position);
            }
            return super.getPageTitle(position);
        }
    }
    

    最后在activity中,对数据进行初始化就可以了

    public class MainActivity extends AppCompatActivity {
    
        private TabLayout mainTab;
        private ViewPager mainContent;
    
        private List<String> tabList;
        private List<Fragment> fragmentList;
        private TabViewPagerAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
    
            initData();
    
            adapter = new TabViewPagerAdapter(getSupportFragmentManager());
            // 设置tablayout数据
            adapter.addData(tabList,fragmentList);
            mainContent.setAdapter(adapter);
            //设置Tablayout与ViewPager的联动
            mainTab.setupWithViewPager(mainContent);
        }
    
        private void initData() {
            tabList = new ArrayList<>();
            tabList.add("推荐");
            tabList.add("关注");
            tabList.add("热门");
    
            fragmentList = new ArrayList<>();
            fragmentList.add(new ContentFragment1());
            fragmentList.add(new ContentFragment2());
            fragmentList.add(new ContentFragment3());
        }
    
        public void initView() {
            mainTab = (TabLayout) findViewById(R.id.main_tab);
            mainContent = (ViewPager) findViewById(R.id.main_content);
        }
    }
    
    

    至此,已经基本的用法已经了解了,效果图:

    tablayout基本使用.png

    当然这里用的都是默认属性,为了方便颜色也用的android自带的,可根据自己的需要设置属性即可。同时可以指定下划线的高度,如果不想显示下划线,可将tabIndicatorColor设置为透明或者设置tabIndicatorHeight为0

    二)进阶

    1)改变TabLayout的文本的大小

    当你修改文本大小时会发现没有textSize这个属性,也就是说无法修改文本大小,但是发现app:tabTextAppearance这个属性,可以修改文本的样式,于是乎,我们就可以通过这个属性间接修改文本大小

    在style中:

     <style name="TabTextSize"  parent="TextAppearance.AppCompat.Widget.ActionBar.Title">
            <item name="android:textSize">18sp</item>
        </style>
    
    2)为TabLayout显示图片

    效果图:

    278362072502111057.jpg

    TabLayout并没有设置图片相关的属性,可以通过TabLyout.Tab对象的setIcon()方法设置,我在搜索过程中发现,很多使用SpannableString来设置图片,如果需要图片有选中和未选中两种状态,则需要对当前Tab是否被点击做个判断,然后传给adapter的getPageTitle()方法来处理。此处我用两个数组存放两种状态的图片,为tablayout设置监听addOnTabSelectedListener来进行切换。

     /**
         * 为Tab设置文字和图片
         */
        private void setTabIcon() {
            if (tabList == null || tabList.size() == 0){
                return;
            }
    
            for (int i = 0; i < tabList.size(); i++){
                //依次获取标签
                TabLayout.Tab tab = mainTab.getTabAt(i);
                //为标签设置图标和文字
                tab.setIcon(tabIcon[i]);
    
                // 默认选中第一项
                if (i == 0 ){
                    tab.setIcon(tabSelectedIcon[0]);
                }
            }
    
            mainTab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    tab.setIcon(tabSelectedIcon[tab.getPosition()]);
                }
    
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
                    tab.setIcon(tabIcon[tab.getPosition()]);
    
                }
    
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
    
                }
            });
        }
    
    3)在TabLayout上显示自定义view

    效果如下图所示,添加另一个增大的效果


    269405666955536014.jpg

    实现过程和图片文字的类似,这里通过setCustomView为tab设置自定义view视图,

      holder = null;
            for (int i = 0; i < tabList.size(); i++) {
                //依次获取标签
                TabLayout.Tab tab = mainTab.getTabAt(i);
                //为每个标签设置布局
                tab.setCustomView(R.layout.custom_tab);
                holder = new ViewHolder(tab.getCustomView());
                //为标签填充数据
                holder.ivTabIcon.setImageResource(tabIcon[i]);
                holder.tvTabText.setText(tabList.get(i));
                holder.tvTabText.setTextColor(getResources().getColor(R.color.c_535151));
    
                //默认选择第一项
                if (i == 0){
                    holder.ivTabIcon.setSelected(true);
                    holder.tvTabText.setSelected(true);
                    holder.ivTabIcon.setImageResource(R.drawable.selected_guanzhu);
                    holder.tvTabText.setTextSize(16);
                    holder.tvTabText.setTextColor(getResources().getColor(R.color.c_406af2));
                }
            }
    
            //tab选中的监听事件
            mainTab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    holder = new ViewHolder(tab.getCustomView());
                    holder.ivTabIcon.setSelected(true);
                    holder.tvTabText.setSelected(true);
                    //选中后字体变大
                    holder.tvTabText.setTextSize(16);
                    holder.tvTabText.setTextColor(getResources().getColor(R.color.c_406af2));
                    //选中后图片变大 变色
                    holder.ivTabIcon.setImageResource(tabSelectedIcon[tab.getPosition()]);
                    //让Viewpager跟随TabLayout的标签切换
                    mainContent.setCurrentItem(tab.getPosition());
    
                }
    
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
                    holder = new ViewHolder(tab.getCustomView());
                    holder.ivTabIcon.setSelected(false);
                    holder.tvTabText.setSelected(false);
                    //恢复为默认字体大小
                    holder.ivTabIcon.setImageResource(tabIcon[tab.getPosition()]);
                    holder.tvTabText.setTextSize(12);
                    holder.tvTabText.setTextColor(getResources().getColor(R.color.c_535151));
    
                }
    
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
    
                }
            });
             }
    
        class ViewHolder{
            ImageView ivTabIcon;
            TextView tvTabText;
    
            public ViewHolder(View tabView) {
                ivTabIcon =  tabView.findViewById(R.id.custom_tab_image);
                tvTabText = tabView.findViewById(R.id.custom_tab_text);
            }
    }
    

    相关文章

      网友评论

          本文标题:Material Design控件使用总结之TabLayout

          本文链接:https://www.haomeiwen.com/subject/irlwjxtx.html