tablayout学习笔记
来源:互联网 发布:javassm开源项目源码 编辑:程序博客网 时间:2024/06/08 06:46
一、TabLayout属性介绍
1改变选中字体的颜色
app:tabSelectedTextColor=”@android:color/holo_red_light”
2.改变未选中字体的颜色
app:tabTextColor=”@color/colorPrimary”
3.改变指示器下标的颜色
app:tabIndicatorColor=”@android:color/holo_red_light”
4.改变指示器下标的高度
app:tabIndicatorHeight=”4dp”
5.改变整个TabLayout的颜色
app:tabBackground=”color”//这里不能直接写RGB,需要@color/xx 或drawable
6.改变TabLayout内部字体大小
app:tabTextAppearance=”@style/TextAppearance.Design.Tab”//设置文字的外貌即颜色字体大小等,也可以自己新建style
<style name="TextAppearance.Design.Tab" parent="TextAppearance.AppCompat.Button"><item name="android:textSize">@dimen/design_tab_text_size</item><item name="android:textColor">?android:textColorSecondary</item><item //字母是否大写name="textAllCaps">true</item></style>
7.添加tab
tabLayout.addTab(tabLayout.newTab().setText(“Tab1”).setIcon(R.mipmap.ic_launcher));
8.加入Padding
设置Tab内部的子控件的Padding:
app:tabPadding=”xxdp”
app:tabPaddingTop=”xxdp”
app:tabPaddingStart=”xxdp”
app:tabPaddingEnd=”xxdp”
app:tabPaddingBottom=”xxdp”
设置整个TabLayout的Padding:
app:paddingEnd=”xxdp”
app:paddingStart=”xxdp”
9.内容的显示模式
app:tabGravity=”center”//居中,如果是fill,则是充满
10.Tab的宽度限制
设置最大的tab宽度:
app:tabMaxWidth=”xxdp”
设置最小的tab宽度:
app:tabMinWidth=”xxdp”
11.Tab的“Margin”:TabLayout开始位置的偏移量:
app:tabContentStart=”100dp”
12.Tab的模式
app:tabMode=”scrollable”
app:tabMode=”fixed”
13。选中某项
tablayout.getTabAt(position).select()
二.TabLayout+ViewPager+Fragment
应用一:纯文本tab
布局文件
<?xml version="1.0" encoding="utf-8"?><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:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.linwei.lw.tablayoutdemo.ui.activity.MainActivity"> <android.support.design.widget.TabLayout android:id="@+id/tab" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabIndicatorColor="@color/colorAccent" app:tabIndicatorHeight="2dp" app:tabMode="fixed" app:tabSelectedTextColor="@color/colorAccent"> </android.support.design.widget.TabLayout> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </android.support.v4.view.ViewPager></LinearLayout>
FragmentFactory
/** * Fragment工厂类。 * Created by LW on 2017/4/20. */public class FragmentFactory { private static HashMap<Integer, BaseFragment> mBaseFragments = new HashMap<Integer, BaseFragment>(); public static BaseFragment createFragment(int pos) { BaseFragment baseFragment = mBaseFragments.get(pos); if (baseFragment == null) { switch (pos) { case 0: baseFragment = new TopNewsFragment();//头条 break; case 1: baseFragment = new NewsFragment();//新闻 break; case 2: baseFragment = new EntertainmentFragment();//娱乐 break; case 3: baseFragment = new SportsFragment();//体育 break; case 4: baseFragment = new FinanceFragment();//财经 break; case 5: baseFragment = new ScienceFragment();//科技 break; case 6: baseFragment = new FashionFragment();//时尚 break; } mBaseFragments.put(pos, baseFragment); } return baseFragment; }}
BaseFragment
public abstract class BaseFragment extends Fragment { protected Context mContent; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContent = getContext(); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return initView(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initData(); } protected abstract void loadData(); protected abstract View initView();}
NewsFragment
public class NewsFragment extends BaseFragment { @Override protected void loadData() { Toast.makeText(mContent,"Fragment头条加载数据",Toast.LENGTH_SHORT).show(); } @Override protected View initView() { TextView mtextView = new TextView(mContent); mView.setGravity(Gravity.CENTER); mView.setTextSize(18); Bundle args = getArguments(); String title = args.getString("title"); mView.setText("Fragment"+title)); mView.setTextColor(Color.BLACK); return mtextView ; }}
<?xml version="1.0" encoding="utf-8"?><resources> <string-array name="tab_short_Title"> <item>头条</item> <item>新闻</item> <item>娱乐</item> <item>体育</item> </string-array> <string-array name="tab_long_Title"> <item>头条</item> <item>新闻</item> <item>娱乐</item> <item>体育</item> <item>财经</item> <item>科技</item> <item>时尚</item> </string-array></resources>
public class TabActivity extends AppCompatActivity { private TabLayout mTab; private ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_short); initView(); initData(); } private void initData() { ShortPagerAdapter adapter = new ShortPagerAdapter(getSupportFragmentManager()); mViewPager.setAdapter(adapter); mTab.setupWithViewPager(mViewPager); } private void initView() { mTab = (TabLayout) findViewById(R.id.tab); mViewPager = (ViewPager) findViewById(R.id.viewpager); } private class ShortPagerAdapter extends FragmentPagerAdapter { public String[] mTilte; public ShortPagerAdapter(FragmentManager fm) { super(fm); mTilte = getResources().getStringArray(R.array.tab_short_Title); } @Override public CharSequence getPageTitle(int position) { return mTilte[position]; } @Override public BaseFragment getItem(int position) { BaseFragment fragment = FragmentFactory.createFragment(position); Bundle bundle=new Bundle(); bundle.putString("title",mTilte[position]); fragment.setArguments(bundle); return fragment; } @Override public int getCount() { return mTilte.length; } }}
效果图:
疑问 1:上述代码只是tablayout..setupWithViewPager(mViewPager),并重写了FragmentPagerAdapter 的getPageTitle()方法,没看见tabLayout.addTab()啊?这些tab怎么加进去的?
setupWithViewPager()方法
public void setupWithViewPager(@Nullable ViewPager viewPager) { setupWithViewPager(viewPager, true); }public void setupWithViewPager(@Nullable final ViewPager viewPager, boolean autoRefresh) { setupWithViewPager(viewPager, autoRefresh, false); }private void setupWithViewPager(@Nullable final ViewPager viewPager, boolean autoRefresh, boolean implicitSetup) { /........省略代码 if (viewPager != null) { mViewPager = viewPager; /........省略代码 final PagerAdapter adapter = viewPager.getAdapter(); //adapter不为 null,调用setPagerAdapter(adapter, autoRefresh); if (adapter != null) { // Now we'll populate ourselves from the pager adapter, adding an observer if // autoRefresh is enabled setPagerAdapter(adapter, autoRefresh); /........省略代码 mSetupViewPagerImplicitly = implicitSetup; }
adapter不为 null,调用setPagerAdapter(adapter, autoRefresh);
void setPagerAdapter(@Nullable final PagerAdapter adapter, final boolean addObserver) { if (mPagerAdapter != null && mPagerAdapterObserver != null) { // If we already have a PagerAdapter, unregister our observer mPagerAdapter.unregisterDataSetObserver(mPagerAdapterObserver); } mPagerAdapter = adapter; if (addObserver && adapter != null) { // Register our observer on the new adapter if (mPagerAdapterObserver == null) { mPagerAdapterObserver = new PagerAdapterObserver(); } adapter.registerDataSetObserver(mPagerAdapterObserver); } // 注意这里 populateFromPagerAdapter(); }
populateFromPagerAdapter()方法
void populateFromPagerAdapter() { //去除所有tabs removeAllTabs(); if (mPagerAdapter != null) { final int adapterCount = mPagerAdapter.getCount(); for (int i = 0; i < adapterCount; i++) { //添加tab并调用PagerAdapter的getPageTitle()方法设置tab的title 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)); } } } }
小结:
- 在setupWithViewPager之前,用tabLayout.addTab()添加tab是没意义的,因为
setupWithViewPager()–>setPagerAdapter( )
–>populateFromPagerAdapter()–> removeAllTabs(),去除所有tab.
// –> 为调用的意思
void populateFromPagerAdapter() { //去除所有tab removeAllTabs(); //.......省略 }
- setupWithViewPager()在哪添加的tab
etupWithViewPager()–>setPagerAdapter( )
–>populateFromPagerAdapter()–>mPagerAdapter != null–>
addTab(newTab().setText(mPagerAdapter.getPageTitle(i)), 添加tab并调用PagerAdapter的getPageTitle()方法设置tab的title
应用二:Tab图片显示或图片加文字。
方法一:
不重写getPageTitle()方法
tabLayout.setupWithViewPager(viewPager); for (int i = 0; i < tabLayout.getTabCount(); i++) { //设置图片选择器 Drawable drawable = getResources(). getDrawable(R.drawable.image_select); TabLayout.Tab tab = tabLayout.getTabAt(i); tab.setIcon(drawable);//只显示图片 // 显示图片加文字用tab.setIcon(drawable).setText(title[i]); }
方法二:
步骤一:
int[] imageNormal= {R.mipmap.pic1, R.mipmap.pic2, R.mipmap.pic3, R.mipmap.pic4,R.mipmap.pic5,R.mipmap.pic6,R.mipmap.pic7};int[] imageSelect = {R.mipmap.pic_sel_1, R.mipmap.pic_sel_2, R.mipmap.pic_sel_3, R.mipmap.pic_sel_4, R.mipmap.pic_sel_5, R.mipmap.pic_sel_6, R.mipmap.pic_sel_7};
步骤二:
@Override public CharSequence getPageTitle(int position) { //titles[position]为"",则只显示图片,titles[position]不为"",显示图片+文字 return getSpannableString(false,imageNormal[position], titles[position]); } @NonNull private SpannableString getSpannableString(boolean isSelected,int imageId, String title) { SpannableString spannableString=new SpannableString(" "+ title);Drawable drawable= ContextCompat.getDrawable(MainActivity.this, imageId); drawable.setBounds(0,0,drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); //注意ImageSpan的渲染问题 ,textAllCaps=true,会阻止ImageSpan的渲染 ImageSpan imageSpan=new ImageSpan(drawable); spannableString.setSpan(imageSpan,0,1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); if (isSelected){spannableString.setSpan(new ForegroundColorSpan(Color.RED), 1, source.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); }else {spannableString.setSpan(new ForegroundColorSpan(Color.BLACK), 1, source.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } return spannableString; }
步骤三:
重点:修改app:tabTextAppearance设置的style中textAllCaps的值,textAllCaps=false;因为TabLayout的textAllCaps属性默认值是true,会阻止ImageSpan的渲染,我们只需要将其重写为false即可.
这种方法设置选择器没效果,所以
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { updateTabStase(tab,imageSelect,title); } @Override public void onTabUnselected(TabLayout.Tab tab) { updateTabStase(tab,imageNormol,title); } @Override public void onTabReselected(TabLayout.Tab tab) { } }); @NonNull private void updateTabStase(TabLayout.Tab tab, int[] imageIds, String[] titles) { int position = tab.getPosition(); SpannableString spannableString = getSpannableString(tab.isSelected(),imageIds[position], titles[position]); tab.setText(spannableString); } 记住在addOnTabSelectedListener()后加上这句 tabLayout.getTabAt(0).setText(getSpannableString(true,imageSelect[0], titles[0]).select();
只显示图片
图片加文字
应用三:tab以自定义View形式展示
步骤一:不重写FragmentPagerAdapter的getPageTitle()方法。
步骤二:在FragmentPagerAdapter添加一个自定义方法getTabView()
View getTabView(int postiion){ View view= LayoutInflater.from(MainActivity.this). inflate(R.layout.activity_main,null) TextView title= view.findViewById(R.id.title); ImageView image= view.findViewById(R.id.Image); title.setText(title[postiion]); image.setImageResource(imageIds[postiion]); return view; };
步骤三:在tablayout.setupWithViewPager()之后手动给tab设置CustomView。
tablayout.setupWithViewPager(mViewpager) for (int i = 0; i < tabLayout.getChildCount(); i++) { TabLayout.Tab tab = tabLayout.getTabAt(i); tab.setCustomView(adapter.getTabView(i)); }
步骤四:tab状态切换改变CustomView状态,例如:颜色,图片等
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { setTabSelectedState(tab); } @Override public void onTabUnselected(TabLayout.Tab tab) { setTabUnSelectedState(tab); } @Override public void onTabReselected(TabLayout.Tab tab) { }} private void setTabSelectedState(TabLayout.Tab tab) { View customView = tab.getCustomView(); TextView title= (TextView)customView.findViewById(R.id.title); ImageView tabIcon = (ImageView) customView.findViewById(R.id.image); title.setTextColor(ContextCompat.getColor(getActivity(), R.color.colorPrimary)); int position = tab.getPosition(); switch (position) { case 0: tabIcon.setImageResource(R.drawable.TopNews_Selected); break; case 1: tabIcon.setImageResource(R.drawable.News_Selected); break; case 2: tabIcon.setImageResource(R.drawable.Entertainment_Selected); break; case 3: tabIcon.setImageResource(R.drawable.Sports_Selected); break; } private void setTabUnSelectedState(TabLayout.Tab tab) { View customView = tab.getCustomView(); TextView tabText = (TextView) customView.findViewById(R.id.tv_tab_text); ImageView tabIcon = (ImageView) customView.findViewById(R.id.iv_tab_icon); tabText.setTextColor(ContextCompat.getColor(getActivity(), R.color.black_1)); int position = tab.getPosition(); switch (position) { case 0: tabIcon.setImageResource(R.drawable.TopNews); break; case 1: tabIcon.setImageResource(R.drawable.News); break; case 2: tabIcon.setImageResource(R.drawable.Entertainment); break; case 3: tabIcon.setImageResource(R.drawable.Sports); break; }
三.app:tabMode和app: tabGravity
(1)app:tabMode有两个值:fixed和scrollable。
(2)app:tabGravity有两个值:fill和center。
1)tabGravity=”fill”和tabMode=”fixed”
2)tabGravity=”center”和tabMode=”fixed”
3)tabGravity=”fill”和tabMode=”scrollable”
4)tabGravity=”center”和tabMode=”scrollable”
- tablayout学习笔记
- Material Design —— TabLayout学习笔记
- TabLayout学习
- Android学习笔记十八之TabLayout标签布局
- MaterialDesign学习笔记2:TabLayout+ViewPaper实现滑动切换
- Android学习笔记(七)--滑动选项卡TabLayout
- Android学习笔记十八之TabLayout标签布局
- android desgin TabLayout 、Snackbar 、自定义TabLayout学习
- Android TabLayout学习资料
- TabLayout详细学习解析
- TabLayout属性的学习
- ViewPager+TabLayout 学习Demo
- Tablayout初使用(笔记)
- Material Design 笔记之 TabLayout
- Material Design学习之TabLayout
- TabLayout
- tablayout
- Tablayout
- 【博览网】设计模式——第二周课程笔记
- java中synchronized关键字的用法
- 关于mysql的单机多实例方案
- 面试准备
- CF #437
- tablayout学习笔记
- Kattis
- 234. Palindrome Linked List
- 【poj 2407】 Relatives 【Waterloo local 2002.07.01】
- 将图片保存为h5py文件
- python 条件判断
- C语言文件读写练习:从键盘读入若干字符,并逐个将这些字符写入文件中,直至输入"#"结束。再将这些字符从文件中读出并显示到屏幕上。
- html web页面锚点的设置
- B