上篇文章說到如何在安卓項目中添加ActionBar(前文請戳這裏),在添加完ActionBar以後,就能夠用它作一些更加有趣的事情了,好比這篇文章要說的Tab導航。html
首先,上一張官方文檔的Tab導航展現圖
圖1 Tab導航展現
如圖所示,Tab導航通常位於ActionBar的下方,一般由三個Tabs組成(固然選項卡的數量是能夠自定義的),其中每一個Tab關聯一個Fragment,經過在不一樣Tab間的切換,能夠實現Fragment的交替顯示。
接下來,就是添加Tab導航的詳細步驟
1.爲ActionBar設置導航模式
ActionBar的導航模式一共有三種(List,Standard,Tabs文檔介紹)經過在Activity裏調用ActionBar的setNavigationMode()方法來設置具體的導航模式,示例代碼以下:java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main);// 使用Tab導航能夠不用設置根視圖(root view),文章後面會作解釋 ActionBar actionBar = getSupportActionBar();// 若是不使用Android Support Library, 則調用getActionBar()方法 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);// NAVIGATION_MODE_TABS常量表示Tab導航模式 actionBar.setDisplayShowTitleEnabled(true);// 這裏的Title顯示的是Activity的android:label屬性指定的文字,也就是圖1中」Google Play」 }
2.添加Tab
先貼示例代碼android
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); actionBar.setDisplayShowTitleEnabled(true); Tab tab = actionBar.newTab().setText("第一項").setTabListener(this); actionBar.addTab(tab); tab = actionBar.newTab().setText("第二項").setTabListener(this); actionBar.addTab(tab); tab = actionBar.newTab().setText("第三項").setTabListener(this); actionBar.addTab(tab); }
能夠看出,添加一個Tab只須要兩個步驟——(1)定義一個Tab對象;(2)調用ActionBar的addTab(Tab tab)方法。但這裏須要注意的一點就是Tab事件監聽器的設置,Tab導航的事件監聽類ActionBar.TabListener總共有三個抽象方法:segmentfault
@Override public void onTabSelected(Tab tab, FragmentTransaction ft) { // Tab選中時要執行的代碼 } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { // Tab離開選中狀態時執行的代碼 } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { // Tab被選中後用戶再次選中該Tab所執行的代碼,一般不作任何事情 }
這三個方法須要注意的是FragmentTransaction參數的使用(文檔介紹)。往FragmentTransaction添加Fragment能夠用兩種方法add()或者attach(),add()有三個重載方法,但這裏咱們只看add(int containerViewId, Fragment fragment, [String tag])裏的第一個參數containerViewId,根據名字能夠知道這個參數表示Fragment所在容器ViewGroup的Id。也就是說,在Activity調用setContentView()所設置的根視圖裏,至少要包含一個ViewGroup,而且該ViewGroup須要有一個id。可是若是是Fragment所要展現的內容會填滿整個Tab,那麼就能夠省去setContentView()方法,並用android.R.id.content來設置containerViewId,以下面代碼所示:app
@Override public void onTabSelected(Tab tab, FragmentTransaction ft) { switch (tab.getPosition()) { case 0: BlackFragment bf = new BlackFragment(); ft.add(android.R.id.content, bf); // ft.commit(); break; case 1: GreenFragment gf = new GreenFragment(); ft.add(android.R.id.content, gf); // ft.commit(); break; case 2: WhiteFragment wf = new WhiteFragment(); ft.add(android.R.id.content, wf); // ft.commit(); break; default: break; } }
由於系統會自動調用ft.commit()方法,因此這裏再次調用的話會拋出java.lang.IllegalStateException。同時若是但願在Tab切換時Fragment能保存上一次離開時的狀態,那麼應該使用attach(Fragment fragment)方法,關於add()和attach()詳細的使用方法,請參考文檔介紹。
下面是Fragment代碼和三張Tab導航的效果圖ide
public class BlackFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LinearLayout colorLayout = new LinearLayout(getActivity()); LinearLayout.LayoutParams ll = new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); colorLayout.setBackgroundColor(Color.BLACK); colorLayout.setLayoutParams(ll); return colorLayout; } }