上篇说到,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导航就完成了。