Tablayout實現導航欄
1.什麼是TabLayout
在原始碼中給出了TabLayout的定義:
TabLayout provides a horizontal layout to display tabs.
意思很明顯:TabLayout提供了一個水平的佈局用來展示Tabs。
Design庫:AS有直接的引用,如果是Eclipse這裡提供一個通道-Design庫
特別說明:
Caused by: java.lang.IllegalArgumentException: You need to use a Theme.AppCompat theme (or descendant) with the design library.
在清單檔案中設定如下程式碼即可:
android:theme="@style/Theme.AppCompat"
2.TabLayout的基本使用方式
方式一:
1.在佈局中加入該控制元件:
<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
2.在程式碼中
tabLayout= (TabLayout) findViewById(R.id.tabLayout);
tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
3.顯示效果
感覺還不錯吧,挺簡單就實現了這個UI效果。
方式二:
<android.support.design.widget.TabLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<android.support.design.widget.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tab1"/>
...
</android.support.design.widget.TabLayout>
方式三:
使用Tablayout,首先需要在專案中加入Design包
dependencies { compile 'com.android.support:design:24.1.1' }
在activity_main.xml佈局檔案中
<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:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="zhengliang.com.tablayout.MainActivity"> <android.support.design.widget.TabLayout android:id="@+id/tab" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" > </android.support.design.widget.TabLayout> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout>
裡面一個Tablayout和一個ViewPager就行了
實現上面的效果需要建立幾個Fragment,這裡為了方便就直接建立了一個基本的Fragment需要的時候直接new就行了,實現程式碼如下:
public class BlankFragment extends Fragment { public BlankFragment() { } public static BlankFragment newInstance(String text){ Bundle bundle = new Bundle(); bundle.putString("text",text); BlankFragment blankFragment = new BlankFragment(); blankFragment.setArguments(bundle); return blankFragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_blank, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); TextView textView = (TextView) view.findViewById(R.id.pager_text); textView.setText(getArguments().getString("text")); } }
有了Fragment還需要一個實現一個ViewPagerAdapter
public class MyAdapter extends FragmentPagerAdapter { private List<String> list; public MyAdapter(FragmentManager fm, List<String> list) { super(fm); this.list = list; } @Override public Fragment getItem(int position) { return BlankFragment.newInstance(list.get(position)); } @Override public int getCount() { return list.size(); } @Override public CharSequence getPageTitle(int position) { return list.get(position); } }
Adapter的寫法非常簡單,在自定義Adapter的時候需要重寫裡面的
getPagerTitle()
方法,實現這個方法是為了當Tablayout與ViewPager繫結的時候能夠繫結Tab標籤的標題一切準備就緒,直接看MainActivity.java中的程式碼
public class MainActivity extends AppCompatActivity { private TabLayout tab; private ViewPager pager; private List<String> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /*初始化介面*/ initViews(); /*初始化資料*/ initData(); /*設定Adapter*/ pager.setAdapter(new MyAdapter(getSupportFragmentManager(),list)); /*Tab與ViewPager繫結*/ tab.setupWithViewPager(pager); } /*初始化資料*/ private void initData() { list = new ArrayList<>(); for (int i = 0; i < 5 ; i++) { list.add(String.format(Locale.CHINA,"第%02d頁",i)); } } /*初始化介面*/ private void initViews() { this.pager = (ViewPager) findViewById(R.id.pager); this.tab = (TabLayout) findViewById(R.id.tab); } }
到這裡基本就實現了上面圖的效果,裡面一句很關鍵的程式碼:
tab.setupWithViewPager(pager);
只有加了這句程式碼才能實現Tab和ViewPager的繫結
這樣同樣也可以實現方式一的效果,可是單單這樣並不能滿足我們。於是接下來看看有什麼屬性可以使用。
3.改變下TabLayout的顏色
上面的Tab顏色感覺不好看,打算換換:
1.改變選中字型的顏色
app:tabSelectedTextColor="@android:color/holo_orange_light"
2.改變未選中字型的顏色
app:tabTextColor="@color/colorPrimary"
3.改變指示器下標的顏色
app:tabIndicatorColor="@android:color/holo_orange_light"
4.改變整個TabLayout的顏色
app:tabBackground="color"
於是現在我的Tab變成了這個樣子:
4.改變TabLayout內部字型大小
總覺得這個字型有點小了,於是想找方法把這個字變得大一點,
好像沒有直接變大的方法,可是找到了這個:
app:tabTextAppearance="@android:style/TextAppearance.Holo.Large"//設定文字的外貌
效果:
5.改變指示器下標的高度
既然字型變大了,指示器太小就顯得不太好看了,
設定指示器下標的高度:
app:tabIndicatorHeight="4dp"
效果:
6.新增圖示
有時候Tab只有文字感覺有點單調了:
tabLayout.addTab(tabLayout.newTab().setText("Tab 1").setIcon(R.mipmap.ic_launcher));
7.Tab的模式
資料很多的時候我們應該怎麼辦呢,簡書中的第二個Tab就是可以滑動的:
我們先多加幾個tab:
tabLayout.addTab(tabLayout.newTab().setText("Tab 4"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 5"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 6"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 7"));
然後設定屬性為:
app:tabMode="scrollable"
預設是fixed:固定的,標籤很多時候會被擠壓,不能滑動。
效果如下:
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.TabLayout的監聽事件
選中了某個tab的監聽事件OnTabSelectedListener():
tabLayout.setOnTabSelectedListener(newTabLayout.OnTabSelectedListener() {
@Override
public voidonTabSelected(TabLayout.Tab tab) {
//選中了tab的邏輯
}
@Override
public voidonTabUnselected(TabLayout.Tab tab) {
//未選中tab的邏輯
}
@Override
public voidonTabReselected(TabLayout.Tab tab) {
//再次選中tab的邏輯
}
});
13.和ViewPager的聯動
最後也是最重要的:
tabLayout.setupWithViewPager(Viewpager);
一行程式碼和ViewPager聯動起來,簡單粗暴。
14.簡單模仿簡書Android端的Tab
主要就是設定下標的高度為0,相當於沒有下標。
app:tabIndicatorHeight="0dp"
然後設定背景顏色以及選中文字顏色
app:tabSelectedTextColor="#ff7a61"
app:tabBackground="#f6f4f2"//這裡不能直接寫RGB,需要@color/xx
最後設定Tab的模式:
app:tabMode="scrollable"
當然Tablayout還可以做很多的樣式,如果有關於Tablayout的注意事項或者相關知識的文章,希望大家可以分享給我,多謝!
15.仿京東商品詳情Android端的Tab
主要原理是setCustomView()載入自定義檢視,來實現字型大小的改變,預設的TabLayout不能改變。
補充:預設選中某項
tablayout.getTabAt(position).select();
好了,上面這些就是TabLayout最基本的用法…
相關文章
- jQuery實現吸頂動畫導航欄jQuery動畫
- 修改 support 包 TabLayout,實現新浪微博/即刻 APP 蚯蚓導航效果TabLayoutAPP
- Flutter仿閒魚底部導航欄實現Flutter
- iOS 超Easy實現 漸變導航欄iOS
- 商城側欄導航效果實現詳解
- iOS逆向之分析微信導航欄實現iOS
- 【前端】javascript實現導航欄筋斗雲效果特效前端JavaScript特效
- Bootstrap 4 實現導航欄右側對齊boot
- JS如何實現導航欄的智慧浮動JS
- 在 Flutter 中實現一個浮動導航欄Flutter
- 快速實現底部導航欄及未讀訊息
- Android 使用BottomNavigationView實現底部導航欄AndroidNavigationView
- css3實現動態圓形導航欄CSSS3
- 安卓導航抽屜 Navigation Drawer 實現沉浸通知欄安卓Navigation
- 拖動滾動條實現側欄導航定位效果
- WordPresscategory導航欄Go
- 實現左側導航和橫向導航
- qml 導航欄TabBar 工具欄ToolBartabBar
- iOS 記一次導航欄平滑過渡的實現iOS
- JavaScript實現HTML導航欄下拉選單[懸浮顯示]JavaScriptHTML
- Android BottomNavigationView,底部導航欄的簡單實現AndroidNavigationView
- CSS實現的側欄三級導航選單程式碼CSS
- 僅2步實現 拜拜 漢堡導航欄效果~ 全新底部導航互動(滑動隱藏)
- GitHub 導航欄加強Github
- HTML橫向導航欄HTML
- Flutter 導航欄AppBarFlutterAPP
- iOS 導航欄的控制iOS
- bootstrap導航欄學習boot
- android 自定義狀態列和導航欄分析與實現Android
- js實現點選導航欄使當前背景變色程式碼JS
- uniapp自定義導航欄APP
- 炫酷:一句程式碼實現標題欄、導航欄滑動隱藏,ByeBurger庫的使用和實現
- 室內導航用什麼來實現?通過什麼可以實現導航功能?
- 如何實現園區路線導航?園區樓宇地圖導航如何實現?地圖
- ReactNative實現地圖導航React地圖
- WPF/C#:實現導航功能C#
- 微信小程式自定義導航欄微信小程式
- CSS導航欄及下拉選單CSS