?
? ????? PHP ??? ???? ??? ?? ??
TabHost
翻譯時間:2010-11-25
版本:Android 2.3 r1
?
結(jié)構(gòu)
繼承關(guān)系
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頁的內(nèi)容。個別元素通常控制使用這個容器對象,而不是設(shè)置在子元素本身的值。
(譯者注:即使使用的是單個元素,也最好把它放到容器對象ViewGroup里)
?
內(nèi)部類
interface TabHost.OnTabChangeListener????
接口定義了當選項卡更改時被調(diào)用的回調(diào)函數(shù)
?
interface TabHost.TabContentFactory??
當某一選項卡被選中時生成選項卡的內(nèi)容
?
class TabHost.TabSpec?????
單獨的選項卡,每個選項卡都有一個選項卡指示符,內(nèi)容和tag標簽,以便于記錄.
?
公共方法
public void addTab (TabHost.TabSpec tabSpec)
新增一個選項卡
參數(shù)
tabSpec??? 指定怎樣創(chuàng)建指示符和內(nèi)容.
?
public void clearAllTabs ()
從tab widget中移除所有關(guān)聯(lián)到當前tab host的選項卡
?
public boolean dispatchKeyEvent (KeyEvent event)
分發(fā)按鍵事件到焦點傳遞路線上的下一視圖。焦點傳遞路線從視圖樹的頂層開始一直到當前獲取焦點的視圖停止。如果此視圖已經(jīng)獲取焦點,將分發(fā)給它自身。否則,將分發(fā)到焦點傳遞路線的下一節(jié)點。此方法會觸發(fā)任何一個按鍵監(jiān)聽器.
(譯者注:關(guān)于focus path,可以參考以下地址:
http://blog.csdn.net/maxleng/archive/2010/05/04/5557758.aspx)
參數(shù)
event??????? 分發(fā)的按鍵事件
返回值
如果事件已經(jīng)處理則返回true,否則返回false.
?
public void dispatchWindowFocusChanged (boolean hasFocus)
當窗口包含的此視圖獲取或丟失焦點時觸發(fā)此方法.ViewGroups應(yīng)該重寫以路由到他的子元素
參數(shù)
hasFocus 如果窗口包含的此view依獲取焦點,返回true,否則返回false.
?
public int getCurrentTab ()
(譯者注:獲取當前選項卡的id)
?
public String getCurrentTabTag ()
(譯者注:當前選項卡的Tag標簽內(nèi)容)
?
public View getCurrentTabView ()
(譯者注:獲取當前選項卡的視圖view)
?
public View getCurrentView ()
(譯者注:獲取當前的視圖view)
?
public FrameLayout getTabContentView ()
獲取保存tab內(nèi)容的FrameLayout
?
public TabWidget getTabWidget ()
(譯者注:根據(jù)系統(tǒng)規(guī)定的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,并關(guān)聯(lián)到當前tab host
參數(shù)
tag?? 所需的選項卡標簽(tag)
?
public void onTouchModeChanged (boolean isInTouchMode)
當觸摸模式發(fā)生改變時調(diào)用的回調(diào)函數(shù).
參數(shù)
isInTouchMode???????? 如果視圖結(jié)構(gòu)當前處于觸摸模式,返回true,否則返回false.
?
public void setCurrentTab (int index)
(譯者注:設(shè)置當前的選項卡
參數(shù)
Index??????? 為當前選項卡的索引。)
?
public void setCurrentTabByTag (String tag)
(譯者注:根據(jù)選項卡的Tab標簽來設(shè)置當前的選項卡
??????????????????????????? 參數(shù)
tag? 想要被設(shè)置為當前選項卡的tag標簽值。)
?
public void setOnTabChangedListener (TabHost.OnTabChangeListener l)
注冊一個回調(diào)函數(shù),當選項卡中的任何一個tab的選中狀態(tài)發(fā)生改變時調(diào)用。
(譯者注:setCurrentTab(index)時會觸發(fā)調(diào)用)
參數(shù)
l??????? 將運行的回調(diào)函數(shù)
????????
public void setup ()
如果使用findViewById()加載TabHost,那么在新增一個選項卡tab之前,需要調(diào)用setup()。然而,當你在一個TabActivity里使用getTabHost()獲取TabHost,你就不再需要調(diào)用setup()了。(譯者注:實現(xiàn)tab窗口的兩種方法:繼承activity時,使用findViewById()查找TabHost,然后調(diào)用setup();繼承TabActivity,通過getTabHost()查找,此時不用調(diào)用setup())例子:
?
public void setup (LocalActivityManager activityGroup)
如果你使用setContent(android.content.Intent),那么當activityGroup用于加載本地activity之時,必須調(diào)用此方法。如果你拓展(繼承)TabActivity將自動調(diào)用setup()方法。
參數(shù)
activityGroup?? 用來為選項卡內(nèi)容加載activities的ativityGroup
?
受保護方法
protected void onAttachedToWindow ()
當視圖附加到窗口上時被調(diào)用。在這個點的表面進行繪制。注意此函數(shù)確保在onDraw(Cancas)之前調(diào)用,然而它可能在第一次執(zhí)行onDraw之前的任何時間被調(diào)用——包括的onMeasure(int,int)的之前或之后。
?
protected void onDetachedFromWindow ()
當視圖從窗口分離時被調(diào)用。在這個點的表面不再有畫面繪制。
?
補充
文章鏈接
???????? 史上最全的Android的Tab與TabHost講解
???????? Android UI設(shè)計 Tab TabHost標簽頁的使用
???????? Android 控件之TabHost Tab頁
動態(tài)Tab頁
示例代碼
???????? 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));
??????? tabHost.addTab(tabHost.newTabSpec("tab3")
??????????????? .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:layout_width="match_parent"
??????? android:layout_height="match_parent"
??????? android:text="@string/tabs_1_tab_2"/>
??? <TextView android:id="@+id/view3"
??????? android:background="@drawable/green"
??????? android:layout_width="match_parent"
??????? android:layout_height="match_parent"
??????? android:text="@string/tabs_1_tab_3"/>
</FrameLayout>
詳細參見apidemo/view/tabs1