Android UI學習 - Tab的學習和使用
TabActivity
首先Android裡面有個名為TabActivity來給我們方便使用。其中有以下可以關注的函式:
public TabHost getTabHost () 獲得當前TabActivity的TabHost
public TabWidget getTabWidget () 獲得當前TabActivity的TabWidget
public void setDefaultTab (String tag) 這兩個函式很易懂,就是設定預設的Tab
public void setDefaultTab (int index) 通過tab名——tag或者index(從0開始)
protected void onRestoreInstanceState (Bundle state) 這兩個函式的介紹可以
protected void onSaveInstanceState (Bundle outState) 參考 Activity的生命週期
TabHost
那麼我們要用到的Tab載體是TabHost,需要從TabActivity.getTabHost獲取。
現在看看TabHost類,它有3個內嵌類:1個類TabHost.TabSpec,2個介面TabHost.TabContentFactory和TabHost.OnTabChangeListener。後面會介紹這些類和介面。
TabHost類的一些函式:
public void addTab (TabHost.TabSpec tabSpec) 新增tab,引數TabHost.TabSpec通過下面的函式返回得到
public TabHost.TabSpec newTabSpec (String tag) 建立TabHost.TabSpec
public void clearAllTabs () remove所有的Tabs
public int getCurrentTab ()
public String getCurrentTabTag ()
public View getCurrentTabView ()
public View getCurrentView ()
public FrameLayout getTabContentView () 返回Tab content的FrameLayout
public TabWidget getTabWidget ()
public void setCurrentTab (int index) 設定當前的Tab by index
public void setCurrentTabByTag (String tag) 設定當前的Tab by tag
public void setOnTabChangedListener (TabHost.OnTabChangeListener l) 設定TabChanged事件的響應處理
public void setup () 這個函式後面介紹
TabHost.TabSpec
從上面的函式可以知道如何新增tab了,要注意,這裡的Tag(標籤),不是Tab按鈕上的文字。
而要設定tab的label和content,需要設定TabHost.TabSpec類。 引用SDK裡面的話——“A tab has a tab indicator, content, and a tag that is used to keep track of it.”,TabHost.TabSpec就是管理這3個東西:
public String getTag ()
public TabHost.TabSpec setContent
public TabHost.TabSpec setIndicator
我理解這裡的Indicator就是Tab上的label,它可以
設定label: setIndicator (CharSequence label)
或者同時設定label和icon:setIndicator (CharSequence label, Drawable icon)
或者直接指定某個view: setIndicator (View view)
對於Content,就是Tab裡面的內容,可以
設定View的id: setContent(int viewId)
或者TabHost.TabContentFactory的createTabContent(String tag)來處理:setContent(TabHost.TabContentFactory contentFactory)
或者用new Intent來引入其他Activity的內容:setContent(Intent intent)
現在來看官方的Views/Tabs/Content By Id例子:
程式碼
- public class Tabs1 extends TabActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TabHost tabHost = getTabHost();
- LayoutInflater.from(this).inflate(R.layout.tabs1, tabHost.getTabContentView(), true);
- tabHost.addTab(tabHost.newTabSpec("tab1")
- .setIndicator("tab1")
- .setContent(R.id.view1));
- tabHost.addTab(tabHost.newTabSpec("tab3")
- .setIndicator("tab2")
- .setContent(R.id.view2));
- tabHost.addTab(tabHost.newTabSpec("tab3")
- .setIndicator("tab3")
- .setContent(R.id.view3));
- }
- }
原來在獲取TabHost後,需要用LayoutInflater來得到Layout,LayoutInflater在後面就詳細介紹。R.layout.tabs1的內容:
- <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView android:id="@+id/view1"
- android:background="@drawable/blue"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="@string/tabs_1_tab_1"/>
- <TextView android:id="@+id/view2"
- android:background="@drawable/red"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="@string/tabs_1_tab_2"/>
- <TextView android:id="@+id/view3"
- android:background="@drawable/green"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="@string/tabs_1_tab_3"/>
- </FrameLayout>
- <! -- strings.xml
- <string name="tabs_1_tab_1">tab1</string>
- <string name="tabs_1_tab_2">tab2</string>
- <string name="tabs_1_tab_3">tab3</string>
- -->
原來是用FrameLayout的!
而讓Tab1的內容顯示tab1且背景為Blue,是setContent(R.id.view1)這裡引用了TextView1。現在就基本明白如何新增tab以及如何設定label和content了。
接下來看看Views/Tabs/Content By Factory的例子:
程式碼
- public class Tabs2 extends TabActivity implements TabHost.TabContentFactory {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- final TabHost tabHost = getTabHost();
- tabHost.addTab(tabHost.newTabSpec("tab1")
- .setIndicator("tab1", getResources().getDrawable(R.drawable.star_big_on))
- .setContent(this));
- tabHost.addTab(tabHost.newTabSpec("tab2")
- .setIndicator("tab2")
- .setContent(this));
- tabHost.addTab(tabHost.newTabSpec("tab3")
- .setIndicator("tab3")
- .setContent(this));
- }
- public View createTabContent(String tag) {
- final TextView tv = new TextView(this);
- tv.setText("Content for tab with tag " + tag);
- return tv;
- }
- }
可以看到通過override重寫(重新實現)父類TabHost.TabContentFactory中的方法View createTabContent(String tag)來實現不同tab的不同content。同時在setContent的引數設定為相應的TabContentFactory。
原來createTabContent是在每個tab第一次顯示時才呼叫的,隨後再次顯示該tab就不會再次呼叫的,我自己用Logcat檢視到的!這一點很關鍵,就是說在createTabContent是在tab沒有完全建立前呼叫的,這意味在createTabContent裡面是不能呼叫getCurrentTabView等之類的函式的,否則就出錯!
至於Views/Tabs/Content By Intent例子,就只是貼出程式碼,不給截圖了:
- public class Tabs3 extends TabActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- final TabHost tabHost = getTabHost();
- tabHost.addTab(tabHost.newTabSpec("tab1")
- .setIndicator("list")
- .setContent(new Intent(this, List1.class)));
- tabHost.addTab(tabHost.newTabSpec("tab2")
- .setIndicator("photo list")
- .setContent(new Intent(this, List8.class)));
- // This tab sets the intent flag so that it is recreated each time
- // the tab is clicked.
- tabHost.addTab(tabHost.newTabSpec("tab3")
- .setIndicator("destroy")
- .setContent(new Intent(this, Controls2.class)
- .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));
- }
- }
效果:Tab1的內容是List1的Activity,Tab2的是List8的Activity,Tab3的是controls2.Activity。
TabHost.OnTabChangeListener
TabHost.OnTabChangeListener介面只有一個抽象方法onTabChanged(String tagString),明顯地,在onTabChanged(String tagString)方法裡面swtich..case..來判斷tagString分別處理就行了。
TabHost.setup()
在此貼出SDK doc裡面的相關解釋:
public void setup () Since: API Level 1
Call setup() before adding tabs if loading TabHost using findViewById(). However,You do not need to call setup() after getTabHost() in TabActivity. Example:
mTabHost = (TabHost)findViewById(R.id.tabhost);
mTabHost.setup();
mTabHost.addTab(TAB_TAG_1, "Hello, world!", "Tab 1");
//我的理解是,如果要用到findViewById來獲取TabHost,然後add tabs的話,需要在addTab前call setup();
public void setup (LocalActivityManager activityGroup) Since: API Level 1
If you are using setContent(android.content.Intent), this must be called since the activityGroup is needed to launch the local activity. This
is done for you if you extend TabActivity.
Parameters
activityGroup
Used to launch activities for tab content.
本文出自 “學習Android” 部落格,請務必保留此出處http://android.blog.51cto.com/268543/315208
相關文章
- android Material Design 學習之十:底部Tab的兩種實現AndroidMaterial Design
- Android 開發學習程式0.27 kotlin使用 和viewbinding的使用AndroidKotlinView
- Qt學習第四篇(主視窗和ui的使用)QTUI
- android基礎學習-android篇day12-android的UI基礎入門AndroidUI
- semantic UI學習(二)UI
- Android學習-HandlerAndroid
- Android學習筆記(建立Menu,Intent的使用)Android筆記Intent
- Android學習—— Android佈局Android
- UI自動化學習筆記- PO模型介紹和使用UI筆記模型
- Flutter之FutureBuilder的學習和使用FlutterRebuild
- Swift UI 學習資料SwiftUI
- android基礎學習-android篇day16-Menu的使用Android
- android基礎學習-android篇day16-Dialog的使用Android
- Android 開發學習程式0.32 dwonloadmanager使用Android
- vue學習:使用tab標籤頁時,重新整理頁面停留在當前tabVue
- Android懸浮窗的學習Android
- 收藏的Android學習資源Android
- Flutter學習指南:UI佈局和控制元件FlutterUI控制元件
- 關於Apache Tika的學習和使用Apache
- Pytest學習(三) - setup和teardown的使用
- 機器學習和深度學習的區別機器學習深度學習
- 機械學習和深度學習的區別深度學習
- 前端學習-UI框架學習-Bootstrap5-010-按鈕組前端UI框架boot
- 前端學習-UI框架學習-Bootstrap5-012-進度條前端UI框架boot
- Element-UI / dom.js 的學習UIJS
- 利用SkyWalking UI的api介面學習GraphQLUIAPI
- pagetable的使用學習
- AJAX的學習使用
- android基礎學習-android篇day12-UI基礎控制元件(上)AndroidUI控制元件
- android基礎學習-android篇day13-UI基礎控制元件(下)AndroidUI控制元件
- Android之Mina框架學習Android框架
- Android學習筆記·ANRAndroid筆記
- Android學習筆記·HandlerAndroid筆記
- Android學習筆記·ADBAndroid筆記
- Android學習筆記一Android筆記
- Android SQLite學習筆記AndroidSQLite筆記
- Android開發學習之路Android
- Android Linker學習筆記Android筆記
- Android Studio學習筆記Android筆記