如下圖,在設計app時,常常會使用到這種分頁方式,
例如我寫了一個email app, tab a為 hotmail , tab b 為 gmail ....以此類推,
tabhost就是上面的tab,而viewPager讓我們能夠利用滑動切換頁面
兩個加在一起的話,有較好的使用者經驗。
首先必須先創建 main.xml
在xml可以看到,layout裡面同時擁有 tabhost 以及viewpager
<TabHost android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/tabhost" xmlns:android="http://schemas.android.com/apk/res/android"> <LinearLayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical"> <TabWidget android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@android:id/tabs" android:layout_marginRight="3dp" android:layout_marginLeft="3dp"> </TabWidget> <android.support.v4.view.ViewPager android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/viewpager"/> <FrameLayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@android:id/tabcontent" android:visibility="gone"> </FrameLayout> </LinearLayout> </TabHost>
接著在 tabFragment內
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.login_tab_layout, container,false); mPager = (ViewPager) view.findViewById(R.id.viewpager); mTabHost = (TabHost) view.findViewById(R.id.tabhost); mTabHost.setup(); mTabHost.setOnTabChangedListener(new OnTabChangeListener() { @Override public void onTabChanged(String tabId) { mTabHost.setOnTabChangedListener(new OnTabChangeListener() { @Override public void onTabChanged(String tabId) { mPager.setCurrentItem(mPager.getAdapter().getItemPosition(fragmentMap.get(tabId))); } }); } }); mPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { mTabHost.setCurrentTab(position); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) {} @Override public void onPageScrollStateChanged(int arg0) {} }); return view; }
在點擊tabhost時同時切換viewpager
在切換viewpager時同時切換tabhost
接著要添加fragment在viewpager內,以及添加tab在Tabhost內
public void addFragmentTab(int titleResId, int tabViewResId, Fragment fragment , String tag){ list.add(fragment); fragmentMap.put(tag, fragment); TextView tabView = (TextView) LayoutInflater.from(getActivity()).inflate(tabViewResId, null); tabView.setText(titleResId); TabSpec tabSpec = mTabHost.newTabSpec(tag).setIndicator(tabView); tabSpec.setContent(new TabFactory(getActivity())); mTabHost.addTab(tabSpec); }
接著就完成了
搭配
就可以完成客製化tab
附上 git 的project url
不建議用合併使用 TabHost 和 ViewPager:兩者功能相仿,都有顯示內容的區域,一不小心還會有兩份 fragments,需要額外處理兩者的狀態(就像本文所述,監聽兩者切換分頁,然後互相通知)
回覆刪除建議改用 ViewPager 搭配 SlidingTabLayout 可以做到一樣的效果 :)