日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tab使用 TabActivity TabHost Tabspec常用方法

發布時間:2024/1/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tab使用 TabActivity TabHost Tabspec常用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文是參考Android官方提供的sample里面的ApiDemos的學習總結。

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和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.

    本文出自 “學習Android” 博客,請務必保留此出處http://android.blog.51cto.com/268543/315208

    轉載于:https://www.cnblogs.com/littleby/p/5178736.html

    總結

    以上是生活随笔為你收集整理的tab使用 TabActivity TabHost Tabspec常用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。