android使用implements ActionBar.TabListener的方式创建导航

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

猜你喜欢

转载自raising.iteye.com/blog/2181117
今日推荐