TabLayout是Android Design Support Library库中的控件,利用TabLayout可以实现类似网易或者今日头条的效果,但是因为TabLayout不能设置界面显示的固定标签数,所以一直将它将她打入冷宫,未曾临幸于她。但是这么好的一个妃子,仅仅因为这点缺点就不用她,未免有点可惜。所以今天有时间我又看了下TabLayout的源码。
/**
* Create and return a new {@link Tab}. You need to manually add this using
* {@link #addTab(Tab)} or a related method.
*
* @return A new Tab
* @see #addTab(Tab)
*/
@NonNull
public Tab newTab() {
Tab tab = sTabPool.acquire();
if (tab == null) {
tab = new Tab();
}
tab.mParent = this;
tab.mView = createTabView(tab);
return tab;
}
可以看到tabView是在createTabView里创建,再看下
createTabView的源码:
private TabView createTabView(@NonNull final Tab tab) {
TabView tabView = mTabViewPool != null ? mTabViewPool.acquire() : null;
if (tabView == null) {
tabView = new TabView(getContext());
}
tabView.setTab(tab);
tabView.setFocusable(true);
tabView.setMinimumWidth(getTabMinWidth());
return tabView;
}
TabView的高度是在getTabMinWidth方法里设置,再看下
getTabMinWidth方法:
private int getTabMinWidth() {
if (mRequestedTabMinWidth != INVALID_WIDTH) {
// If we have been given a min width, use it
return mRequestedTabMinWidth;
}
// Else, we'll use the default value
return mMode == MODE_SCROLLABLE ? mScrollableTabMinWidth : 0;
}
有两种设置TabVIew宽度的方式,在这里我们没必要设置
app
:
tabMinWidth这个属性,因为屏幕的宽度是不固定的,我们不可能将tabView的宽度设死。所以就跑到else的方法里。在这里mMode的模式有两种MODE_SCROLLABLE和MODE_FIXED,MODE_FIXED是一下子展示所有的TabView,MODE_SCROLLABLE是展示部分的TabView,其他的TabView通过滑动来实现,说