上篇说到,android现在的版本已经不再推荐使用继承TabActivity(或ActivityGroup)的方式创建Tabhost导航,所以现在尝试使用Fragment片段建立每一个导航标签。具体做法如下:
?
step1,建立一个总的Activity,获取actionBar并创建Tab选项卡
public class StationActivity extends FragmentActivity implements ActionBar.TabListener { private ActionBar actionBar; private String[] tabs = {"最近常用", "热点车站", "车站列表"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.station_select); actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); actionBar.setDisplayShowTitleEnabled(true); //在actionbar中添加EditText 控件 actionBar.setCustomView(R.layout.search); EditText search = (EditText) actionBar.getCustomView().findViewById(R.id.input); //创建Tab选项卡 for(int i=0; i<tabs.length; i++) { Tab tab = actionBar.newTab().setText(tabs[i]).setTabListener(this); actionBar.addTab(tab); } actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME); } }
?
step2,重写tab选项卡选中、不选中、再次选中的方法。每选中一个选项卡就启动相应的Fragment片段,对比上一篇创建tabhost的方式,每一个选项卡都是由一个intent来启动的;而本方式则是由如下方式启动。
@Override public void onTabSelected(Tab tab, FragmentTransaction ft) { switch(tab.getPosition()) {//为避免fragment之间切换出现重叠问题,这里把add方法改成replace方法 case 0: RecentStation recent = new RecentStation(); ft.replace(android.R.id.content, recent); break; case 1: HotStation hot = new HotStation(); ft.replace(android.R.id.content, hot); break; case 2: ListStation list = new ListStation(); ft.replace(android.R.id.content, list); break; } } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { }
?
?
注:RecentStation ,HotStation ,ListStation 都是fragment片段。
?
step3,建立每个选项卡对应的fragment(这里以RecentStation 为例)
public class RecentStation extends Fragment { TextView tv1, tv2; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.station_recent, container, false); tv1 = (TextView) view.findViewById(R.id.tip1); tv2 = (TextView) view.findViewById(R.id.tip2); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onCreate(savedInstanceState);//更多代码。。。。。 } }
?
?
这里需要注意的地方:
?
1、使用此种fragment的方式创建Tabhost选项卡,可以重写的方法有onCreateView,onActivityCreated,onCreate。方法的执行顺序为:onCreate-->onCreateView-->onActivityCreated
?
2、如果想要在fragment对应的布局文件中使用ListView,最好继承自Fragment而不是ListFragment,因为如果继承后者,当listView填充完毕仍然会有一个圆形进度条显示,美观度大打折扣
?
3、一般而言,在onCreateView方法中加载布局文件,找到对应的组件;在onActivityCreated方法中填充数据等。
?
相应的布局文件省略……
至此,采用actionbar的方式创建tabhost导航就完成了。