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 UI元件學習AndroidUI元件
- user_tab_modifications學習
- Android學習之 UI佈局優化AndroidUI優化
- semantic UI學習(二)UI
- android Material Design 學習之十:底部Tab的兩種實現AndroidMaterial Design
- Swift UI 學習資料SwiftUI
- UI學習第02天UI
- UI學習第08天UI
- Android的進階學習(五)--Messenger的使用和理解AndroidMessenger
- UI自動化學習筆記- PO模型介紹和使用UI筆記模型
- Flutter之FutureBuilder的學習和使用FlutterRebuild
- 關於Struts的學習和使用
- Android學習筆記06——handler的使用Android筆記
- Android學習筆記02——Intent的使用Android筆記Intent
- 機械學習和深度學習的區別深度學習
- Flutter學習指南:UI佈局和控制元件FlutterUI控制元件
- Android 開發學習程式0.27 kotlin使用 和viewbinding的使用AndroidKotlinView
- 學習態度和學習計劃
- Element-UI / dom.js 的學習UIJS
- python 學習--map 和 reduce的使用Python
- 關於Apache Tika的學習和使用Apache
- AJAX的學習使用
- Android學習之 WebView使用小結AndroidWebView
- AIDL使用學習(一):基礎使用學習AI
- Android學習-HandlerAndroid
- android逆向學習Android
- Android學習之路Android
- 學習學習再學習
- Android學習筆記(建立Menu,Intent的使用)Android筆記Intent
- Android學習之 Scroller的介紹與使用Android
- android開發之網路學習-Socket學習Android
- 學習UI設計要懂哪些內容?最新UI學習路線圖告訴你UI
- 學好UI設計,需要學習哪些軟體?UI
- 學習UI設計有哪些技巧UI
- 學習UI設計能做什麼UI
- java註解初步學習和使用Java
- 前端學習-UI框架學習-Bootstrap5-010-按鈕組前端UI框架boot
- 前端學習-UI框架學習-Bootstrap5-012-進度條前端UI框架boot