謹以此獻給在外漂泊和奮鬥的程式設計師!!!
遊子吟
作者:孟郊
慈母手中線,遊子身上衣。
臨行密密縫,意恐遲遲歸。
誰言寸草心,報得三春暉。
複製程式碼
今天我們來說說TabLayout在開發中的一些使用集錦!
本文知識點:
- TabLayout是什麼?
- TabLayout的一下常見設定;
- TabLayout的基本使用;
- TabLayout的一些特殊配置;
- TabLayout的一些常見案例。
1. TabLayout是什麼?
TabLayout提供了一個水平佈局來顯示選項卡。之前我們在使用選項卡的時候都是使用RadioGroup和RadioButton實現的,也有使用三方框架的。其實最主要的是沒有TabLayout的動畫效果,程式碼還很複雜!
2. TabLayout的一些常見設定
2.1 基本的屬性設定
- app:tabBackground 設定背景
- app:tabGravity 設定填充型別的
- fill 全部填充 預設的
- center 居中,但是這個是包裹內容的
- tabIndicatorColor 設定選項卡底部橫線的顏色
- tabIndicatorHeight 設定選項可底部橫線的高度
- tabMaxWidth 設定最大寬度
- tabMinWidth 設定最小寬度
- tabMode 設定模式
- MODE_FIXED 固定選項卡,可以顯示所有選項卡,但是多的話不建議使用
- MODE_SCROLLABLE 可以滑動的選項卡,這裡涉及到上面的最大寬度,可以自行設定
- app:tabPadding 設定padding 可以分別設定左上右下的padding距離
- app:tabSelectedTextColor 設定選擇的文字顏色
- app:tabTextAppearance 設定文字的樣式
- app:tabTextColor 設定預設的文字的顏色
- TabItem 內部維護的標籤
- android:icon 設定圖示的
基本的設定就這麼多,上一張基本設定的效果圖
程式碼是這樣滴
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context=".tablayout.TabLayoutActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:background="@color/colorPrimaryDark"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="TabLayout的展示"
android:textColor="@android:color/white"
android:textSize="16sp" />
</android.support.v7.widget.Toolbar>
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@color/colorAccent"
app:layout_constraintTop_toBottomOf="@id/toolbar"
app:tabGravity="fill"
app:tabIndicatorColor="#fcb314"
app:tabIndicatorHeight="5dp"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/colorPrimaryDark"
app:tabTextColor="@android:color/white">
<android.support.design.widget.TabItem
android:layout_width="match_parent"
android:layout_height="match_parent"
android:icon="@mipmap/ic_dialer_sip_white_24dp"
android:text="標籤1" />
<android.support.design.widget.TabItem
android:layout_width="match_parent"
android:layout_height="match_parent"
android:icon="@drawable/ic_search_black_24dp"
android:text="標籤2" />
</android.support.design.widget.TabLayout>
</android.support.constraint.ConstraintLayout>
複製程式碼
2.2 關聯ViewPager的操作
這應該是最常見的操作了。一般由TabLayout都會關聯ViewPager,但是由很多APP是通過
FragmentTransaction
進行替換的。這裡先不去說關於這種方法的實現,感興趣的同學可以自己研究一下!
2.2.1 當你在佈局檔案中設定了相應的標籤
對於這種情況,基本上是標籤固定的情況的設定,直接通多程式碼關聯一下就可以了!
- setupWithViewPager(@Nullable ViewPager viewPager)
- setupWithViewPager(@Nullable final ViewPager viewPager, boolean autoRefresh)
由兩個相應的過載方法,這個autoRefreshsh是是否需要佈局更新的,也就是說你TabLayout的標籤增加的時候,是否需要更新(但是如果你新增了標籤的話,需要更改相應的ViewPager的介面卡中的條目)!如果你想選擇一個指定的條目,可以通過mTb.getTabAt(i).select();
進行相應的選擇!!!
2.2.2 當你的標籤是從伺服器過來的時候
很多APP的標籤內容是通過伺服器過來的,那麼就存在一個動態改變的操作了,往往是通過程式碼去實現條目的,放心。也很簡單,像這樣!!!
tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
複製程式碼
就可以動態的新增tab了。
坑
你在佈局檔案或者動態設定的標籤文字的時候,發現文字不見了?what???我明明設定了。。。這裡你只需要重寫一下ViewPager介面卡中的getPageTitle(int position)
方法,把標題設定進去就好了。其實這個只是針對於標籤固定的內容設定的,但是一般我們的標籤都是不確定個數的,所以一般都是這樣設定的。
3. TabLayout的一些特殊配置
3.1 更改TabLayout顯示的文字
許多挑剔的產品或者美工,會提出各種各樣的關於文字顯示方面的內容,每次我都覺得一個字型就影響使用者體驗了?所以當時我的想法是醬紫的。。。
其實是可以改的,但是真的就影響使用者體驗嗎?你可以這樣改!
<!--TabLayout的文字修改-->
<style name="TabLayoutStyle">
<item name="android:textSize">20sp</item>
<!--這個是控制你輸入的字母大小寫的!-->
<item name="android:textAllCaps">false</item>
</style>
複製程式碼
然後通過app:tabTextAppearance="@style/TabLayoutStyle"
設定進去就好了。這裡說明一下,其實TabLayout裡面預設由三種文字狀態
- TextAppearance.Large
- TextAppearance.Medium
- TextAppearance.Small 感興趣的同學可以設定看看效果!
3.2 關於TabLayot圖示的問題
預設情況下,你設定的圖示是在上邊的,但是產品跑過來說,放在左邊把!這樣好看一點,好看個大頭鬼啊!天天就改改改的.....我的終極絕招是通過程式碼把裡面的內容全部自定義,其實很簡答的啊!TabLayout給我們提供了一個方法,這個方法是Tab的
setCustomView()
設定你想要的佈局的,但是一下幾點內容需要注意的!也是我踩了很久的坑。。。
- getCustomView(); 空指標異常的問題。 起初我還以為我哪裡寫錯了,網上各種找,各種對比,後來我發現了一個問題,如果你在
setupWithViewPager();
之前呼叫新增自定義view的方法(也就是setCustomView())的時候,那麼後面不管你怎麼取都會是空,然後我就在像之前的標題沒有出現的問題,我有了一個大膽的假設,其實你的Tab生成的時機應該是關聯ViewPager之後,所以在這之前你設定的標題才不顯示的,但是你傳入標題的時候,設定標題,因為ViewPager認為標題是固定的,所以這種方式的時候,才會有標題,大家注意一下這裡就好了!!!順序問題。。。 - 設定自定義後的文字顯示問題。 當你設定了自定義View的時候,文字的變色問題就很明顯了,這個時候你只要寫一個selector就可以解決問題了!
這樣無論圖示的問題就不是問題了,你想放在哪裡都可以了。對於美工不能慫。
3.3 關於TabLayout的選中背景
在相應的樣式中設定 **@drawable/tab_background**這個樣式也是一個狀態選擇器,自己寫喜歡的就好了!
3.4 關於TabLayout的監聽問題
有的時候會有監聽點選了那麼TabLayout的操作,關於TabLayout的監聽,這裡就有必要說明一下了!
- addOnTabSelectedListener(@NonNull OnTabSelectedListener listener)
TabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
//選擇的Tab
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
//推出選中的Tab
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
//重新選中Tab的操作
}
});
複製程式碼
所有的回撥都是針對於一個Tab進行操作的。想怎麼改變在相應的回撥紅進行處理就好了!
這裡上兩張效果圖,小夥伴們自己想想怎麼實現的,如果你不知道怎麼實現的話,可以去我的gitHub上看看怎麼實現的。今天的內容就這麼多了,別忘了給自己的母親打個電話!!!see you...