正文
一、結構
public class TabHost extends FrameLayout implements ViewTreeObserver.OnTouchModeChangeListener
java.lang.Object
android.view.View
android.view.ViewGroup
android.widget.FrameLayout
android.widget.TabHost
二、概述
提供頁籤(Tab頁)的視窗視圖容器。此對象包含兩個子對象:一組是使用者可以選擇指定Tab頁的标簽;另一組是FrameLayout用來顯示該Tab頁的内容。個别元素通常控制使用這個容器對象,而不是設定在子元素本身的值。
(譯者注:即使使用的是單個元素,也最好把它放到容器對象ViewGroup裡)
三、内部類
interface TabHost.OnTabChangeListener
接口定義了當選項卡更改時被調用的回調函數
interface TabHost.TabContentFactory
當某一頁籤被選中時生成頁籤的内容
class TabHost.TabSpec
單獨的頁籤,每個頁籤都有一個頁籤訓示符,内容和tag标簽,以便于記錄.
四、公共方法
public void addTab (TabHost.TabSpec tabSpec)
新增一個頁籤
參數
tabSpec 指定怎樣建立訓示符和内容.
public void clearAllTabs ()
從tab widget中移除所有關聯到目前tab host的頁籤
public boolean dispatchKeyEvent (KeyEvent event)
分發按鍵事件到焦點傳遞路線上的下一視圖。焦點傳遞路線從視圖樹的頂層開始一直到目前擷取焦點的視圖停止。如果此視圖已經擷取焦點,将分發給它自身。否則,将分發到焦點傳遞路線的下一節點。此方法會觸發任何一個按鍵監聽器.
(譯者注:關于focus path,可以參考以下位址:
event 分發的按鍵事件
傳回值
如果事件已經處理則傳回true,否則傳回false.
public void dispatchWindowFocusChanged (boolean hasFocus)
當視窗包含的此視圖擷取或丢失焦點時觸發此方法.ViewGroups應該重寫以路由到他的子元素
hasFocus 如果視窗包含的此view依擷取焦點,傳回true,否則傳回false.
public int getCurrentTab ()
(譯者注:擷取目前頁籤的id)
public String getCurrentTabTag ()
(譯者注:目前頁籤的Tag标簽内容)
public View getCurrentTabView ()
(譯者注:擷取目前頁籤的視圖view)
public View getCurrentView ()
(譯者注:擷取目前的視圖view)
public FrameLayout getTabContentView ()
擷取儲存tab内容的FrameLayout
public TabWidget getTabWidget ()
(譯者注:根據系統規定的id:tabs來找到TabWidget,并傳回,注意,這裡的ID必須是tabs。源代碼中表示如下:
private TabWidget mTabWidget;
mTabWidget=(TabWidget)findViewById(com.android.internal.R.id.tabs);)
public TabHost.TabSpec newTabSpec (String tag)
擷取一個新的TabHost.TabSpec,并關聯到目前tab host
tag 所需的頁籤标簽(tag)
public void onTouchModeChanged (boolean isInTouchMode)
當觸摸模式發生改變時調用的回調函數.
isInTouchMode 如果視圖結構目前處于觸摸模式,傳回true,否則傳回false.
public void setCurrentTab (int index)
(譯者注:設定目前的頁籤
Index 為目前頁籤的索引。)
public void setCurrentTabByTag (String tag)
(譯者注:根據頁籤的Tab标簽來設定目前的頁籤
參數
tag 想要被設定為目前頁籤的tag标簽值。)
public void setOnTabChangedListener (TabHost.OnTabChangeListener l)
注冊一個回調函數,當選項卡中的任何一個tab的選中狀态發生改變時調用。
(譯者注:setCurrentTab(index)時會觸發調用)
l 将運作的回調函數
public void setup ()
如果使用findViewById()加載TabHost,那麼在新增一個頁籤tab之前,需要調用setup()。然而,當你在一個TabActivity裡使用getTabHost()擷取TabHost,你就不再需要調用setup()了。(譯者注:實作tab視窗的兩種方法:繼承activity時,使用findViewById()查找TabHost,然後調用setup();繼承TabActivity,通過getTabHost()查找,此時不用調用setup())例子:
public void setup (LocalActivityManager activityGroup)
如果你使用setContent(android.content.Intent),那麼當activityGroup用于加載本地activity之時,必須調用此方法。如果你拓展(繼承)TabActivity将自動調用setup()方法。
activityGroup 用來為頁籤内容加載activities的ativityGroup
五、受保護方法
protected void onAttachedToWindow ()
當視圖附加到視窗上時被調用。在這個點的表面進行繪制。注意此函數確定在onDraw(Cancas)之前調用,然而它可能在第一次執行onDraw之前的任何時間被調用——包括的onMeasure(int,int)的之前或之後。
protected void onDetachedFromWindow ()
當視圖從視窗分離時被調用。在這個點的表面不再有畫面繪制。
六、補充
文章連結
示例代碼
截圖:
JAVA檔案:
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));
.setIndicator("tab3")
.setContent(R.id.view3));
}
}
XML檔案:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:id="@+id/view1"
android:background="@drawable/blue"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/tabs_1_tab_1"/>
<TextView android:id="@+id/view2"
android:background="@drawable/red"
android:text="@string/tabs_1_tab_2"/>
<TextView android:id="@+id/view3"
android:background="@drawable/green"
android:text="@string/tabs_1_tab_3"/>
</FrameLayout>
詳細參見apidemo/view/tabs1
本文轉自over140 51CTO部落格,原文連結:http://blog.51cto.com/over140/582561,如需轉載請自行聯系原作者