安卓開發文檔學習筆記之實現ActionBar中Tab導航

上篇文章說到如何在安卓項目中添加ActionBar(前文請戳這裏),在添加完ActionBar以後,就能夠用它作一些更加有趣的事情了,好比這篇文章要說的Tab導航。html

首先,上一張官方文檔的Tab導航展現圖
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;
    }
}

BlackFragmentGreenFragmentWhiteFragment

相關文章
相關標籤/搜索