下拉式导航:
final ActionBar actionBar = getSupportActionBar(); //设置ActionBar是否显示标题 actionBar.setDisplayShowTitleEnabled(false); //设置导航模式,使用List导航 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); // 为导航设置列表项数据源和监听器 actionBar.setListNavigationCallbacks( // Specify a SpinnerAdapter to populate the dropdown list. new ArrayAdapter<String>(//为导航设置列表项 actionBar.getThemedContext(), android.R.layout.simple_list_item_1, android.R.id.text1, new String[] { getString(R.string.title_section1), getString(R.string.title_section2), getString(R.string.title_section3), }), this);//这个this为导航设置监听器ActionBar.OnNavigationListener,如下所示 //当导航被选中时激发该方法 @Override public boolean onNavigationItemSelected(int position, long id) { // When the given dropdown item is selected, show its contents in the // container view. getSupportFragmentManager().beginTransaction() .replace(R.id.container, PlaceholderFragment.newInstance(position + 1)) .commit(); return true; } //内部类,根据所选列表id动态创建并返回的Fragment类 public static class PlaceholderFragment extends Fragment {}
//设置ActionBar 的Tabs导航 final ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); //FragmentPaperAdapter对象(下面附上),这个适配器根据选择返回对应的Fragment mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); //ViewPaper是Fragment的容器,可以同时管理多个Fragment,并允许多个Fragment切换时提供动画效果,需要为它设置适配器FragmentPagerAdapter // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mSectionsPagerAdapter); // 为ViewPaper设置监听器,当ViewPaper显示的Fragment发生改变时激发该方法 mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { actionBar.setSelectedNavigationItem(position); } }); // 遍历paperAdapter对象所包含的全部Fragment,每个Fragment对应创建一个Tab标签,并设置ActionBar的事件监听接口对象TabListener for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { // Create a tab with text corresponding to the page title defined by // the adapter. Also specify this Activity object, which implements // the TabListener interface, as the callback (listener) for when // this tab is selected. actionBar.addTab( actionBar.newTab() .setText(mSectionsPagerAdapter.getPageTitle(i)) .setTabListener(this) ); } public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } 获取第position位置的Fragment @Override public Fragment getItem(int position) { // getItem is called to instantiate the fragment for the given page. // Return a PlaceholderFragment (defined as a static inner class below). return PlaceholderFragment.newInstance(position + 1); } //该方法的返回值i表明该Adapter总共包括多少个Fragment @Override public int getCount() { // Show 3 total pages. return 3; } //该方法的返回值决定每个Fragment的标题 @Override public CharSequence getPageTitle(int position) { Locale l = Locale.getDefault(); switch (position) { case 0: return getString(R.string.title_section1).toUpperCase(l); case 1: return getString(R.string.title_section2).toUpperCase(l); case 2: return getString(R.string.title_section3).toUpperCase(l); } return null; } }
使用Tab标签页的一般步骤
首先要设计所有的分页的界面布局
Activity继承TabActivity
调用TabActivity的getTabHost()方法获得TabHost对象
通过TabHost创建Tab
TabHost:标签控件核心类,标签的集合
TabHost.TabSpec:标签对象,可以装载View视图。如一个控件或布局
代码说明:
//声明TabHost,然后用LayoutInflater过滤出布局来,给TabHost加上含有Tab页面的FrameLayout TabHost myTabhost=this.getTabHost(); //从TabActivity上面获取放置Tab的TabHost LayoutInflater.from(this).inflate(R.layout.main, myTabhost.getTabContentView(), true); //from(this)从这个TabActivity获取LayoutInflater //R.layout.main 存放Tab布局 //通过TabHost获得存放Tab标签页内容的FrameLayout //是否将inflate 拴系到根布局元素上 在TabHost创建一个标签,然后设置一下标题/图标/标签页布局 myTabhost.addTab(myTabhost.newTabSpec("TT")// 造一个新标签TT .setIndicator("KK",getResources().getDrawable(R.drawable.ajjc))// 设置一下显示的标题为KK,设置一下标签图标为ajjc .setContent(R.id.widget_layout_red)); //设置一下该标签页的布局内容为R.id.widget_layout_red,这是FrameLayout中的一个子Layout
//extends Fragment实现对应导航的回调方法public void onNavigationDrawerItemSelected(int position) implements NavigationDrawerFragment.NavigationDrawerCallbacks mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer); mTitle = getTitle(); // Set up the drawer. mNavigationDrawerFragment.setUp( R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout)); //返回对应的Fragment对象 @Override public void onNavigationDrawerItemSelected(int position) { // update the main content by replacing fragments FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.container, PlaceholderFragment.newInstance(position + 1)) .commit(); } //该方法的返回值决定每个Fragment的标题 public void onSectionAttached(int number) { switch (number) { case 1: mTitle = getString(R.string.title_section1); break; case 2: mTitle = getString(R.string.title_section2); break; case 3: mTitle = getString(R.string.title_section3); break; } } //设置导航打开时的导航文字显示 public void restoreActionBar() { ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); actionBar.setDisplayShowTitleEnabled(true); actionBar.setTitle(mTitle); }
// Create the adapter that will return a fragment for each of the three // primary sections of the app. mSectionsPagerAdapter = new SectionsPagerAdapter( getSupportFragmentManager()); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mSectionsPagerAdapter); public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { // getItem is called to instantiate the fragment for the given page. // Return a DummySectionFragment (defined as a static inner class // below) with the page number as its lone argument. Fragment fragment = new DummySectionFragment(); Bundle args = new Bundle(); args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1); fragment.setArguments(args); return fragment; } @Override public int getCount() { // Show 3 total pages. return 3; } @Override public CharSequence getPageTitle(int position) { Locale l = Locale.getDefault(); switch (position) { case 0: return getString(R.string.title_section1).toUpperCase(l); case 1: return getString(R.string.title_section2).toUpperCase(l); case 2: return getString(R.string.title_section3).toUpperCase(l); } return null; }