編輯:Android開發實例
本文是參考Android官方提供的sample裡面的ApiDemos的學習總結。
原來在獲取TabHost後,需要用LayoutInflater來得到Layout,LayoutInflater在後面就詳細介紹。R.layout.tabs1的內容:
- 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));
- }
- }
原來是用FrameLayout的! 而讓Tab1的內容顯示tab1且背景為Blue,是setContent(R.id.view1)這裡引用了TextView1。現在就基本明白如何添加tab以及如何設置label和content了。 接下來看看Views/Tabs/Content By Factory的例子: 代碼
- <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>
- -->
可以看到通過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 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;
- }
- }
效果:Tab1的內容是List1的Activity,Tab2的是List8的Activity,Tab3的是controls2.Activity。
- 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)));
- }
- }
本文出自 “學習Android” 博客,請務必保留此出處http://android.blog.51cto.com/268543/315208
有時候,為了實現項目中的需求,完成設計好的用戶交互體驗,不的不把這些View重新改造成自己想要的效果。 Android原生的ListView是不支持左右滑動的,但
上一節的顯示賬單明細 上中,賬單明細的顯示已經基本實現,本文主要整理下代碼,實
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我