在fragment中使用tabhost關鍵點有兩個:android
(1),xml文件,TabWidget的id和放置tab對應內容的容器的id。app
(2),tabHost和設置的方式,由於類繼承fragment類(或子類),而不是Activity,更不是TabActivity。ide
主要代碼:佈局
xml文件:this
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/academic" android:layout_width="match_parent" android:layout_height="match_parent"> <TabHost android:id="@+id/tabhost" android:layout_width="wrap_content" android:layout_height="wrap_content" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <!-- TabWidget 的 id 必須是這個‘@android:id/tabs’,不然會拋出錯誤 --> <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal" /> <!-- tab對應內容的容器,id必須是‘@android:id/tabcontent’,不然會拋出錯誤 --> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignTop="@android:id/tabs" > <fragment android:id="@+id/frag1" android:name="com.herald.ezherald.academic.Fragment1" android:layout_width="match_parent" android:layout_height="match_parent" /> <fragment android:id="@+id/frag2" android:name="com.herald.ezherald.academic.Fragment2" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> </RelativeLayout> </TabHost> </LinearLayout>
Java代碼:spa
Javapublic class AcademicFragment extends SherlockFragment implements OnItemClickListener, TabHost.TabContentFactory, TabHost.OnTabChangeListener { String text = null; LinearLayout layout; TabHost tabHost; public AcademicFragment() { text = "Default"; } /* (non-Javadoc) * @see android.support.v4.app.Fragment#setArguments(android.os.Bundle) */ @Override public void setArguments(Bundle args) { // TODO Auto-generated method stub super.setArguments(args); text = args.getString("text"); } /* (non-Javadoc) * @see android.support.v4.app.Fragment#onCreate(android.os.Bundle) */ @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setRetainInstance(true); } /* (non-Javadoc) * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) */ // 這裏是最主要的部分 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { layout = (LinearLayout) inflater.inflate(R.layout.academic_activity_main, null); tabHost =(TabHost) layout.findViewById(R.id.tabhost); tabHost.setup(); tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("tab1").setContent(R.id.frag1)); tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("tab2").setContent(R.id.frag2)); tabHost.setCurrentTab(0); tabHost.setOnTabChangedListener(this); return layout; } @Override public void onTabChanged(String tabId) { // TODO Auto-generated method stub } @Override public View createTabContent(String tag) { // TODO Auto-generated method stub return null; } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub } }
代碼解釋:code
Java代碼裏面涉及到了兩個fragment,就是普通定義的fragment,沒什麼特別的。xml
onCreateView() 方法裏是 TabHost 的主要部分,獲取TabHost的方法是先用 LayoutInflater抽象類獲取佈局對象,而後用佈局對象獲取TabHost,由於不是繼承Activity,因此不能直接用getViewById()。對象
別忘了 tabHost.setup()。blog
可能遇到的問題:
Q:tab佈局出來了,可是對應的內容不顯示
A:緣由極可能是xml佈局產生的的問題。尤爲注意TabWidget和tab對應內容的容器(本例是FrameLayout)。