Android UI學習 – Tab的學習和使用

來源:互聯網
上載者:User
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和iconsetIndicator (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.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.