创建FragmentActivity,总的代码如下:
- package com.example.fragmenttest;
- import android.app.ActionBar;
- import android.app.ActionBar.Tab;
- import android.app.ActionBar.TabListener;
- import android.os.Bundle;
- import android.support.v4.app.FragmentActivity;
- import android.support.v4.view.ViewPager;
- import android.support.v4.view.ViewPager.OnPageChangeListener;
- import android.util.Log;
- import android.view.Menu;
- public class MainActivity extends FragmentActivity {
- public final static int TAB_INDEX_TAB_1 = 0;
- public final static int TAB_INDEX_TAB_2 = 1;
- public final static int TAB_INDEX_TAB_3 = 2;
- public final static int TAB_INDEX_TAB_4 = 3;
- public final static int TAB_COUNT = 4;
- private ViewPager mViewPager;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- // 创建Tab
- setupTest1();
- setupTest2();
- setupTest3();
- setupTest4();
- getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
- getActionBar().setDisplayShowTitleEnabled(false);
- getActionBar().setDisplayShowHomeEnabled(false);
- // 创建 view pager
- mViewPager = (ViewPager)findViewById(R.id.pager);
- getFragmentManager();
- mViewPager.setAdapter(new TestViewPagerAdapter(getSupportFragmentManager()));
- mViewPager.setOnPageChangeListener(new TestPagerListener());
- mViewPager.setCurrentItem(TAB_INDEX_TAB_2);
- }
- private void setupTest1(){
- Tab tab = this.getActionBar().newTab();
- tab.setContentDescription("Tab 1");
- tab.setText("Tab 1");
- tab.setTabListener(mTabListener);
- getActionBar().addTab(tab);
- }
- private void setupTest2(){
- Tab tab = this.getActionBar().newTab();
- tab.setContentDescription("Tab 2");
- tab.setText("Tab 2");
- tab.setTabListener(mTabListener);
- getActionBar().addTab(tab);
- }
- private void setupTest3(){
- Tab tab = this.getActionBar().newTab();
- tab.setContentDescription("Tab 3");
- tab.setText("Tab 3");
- tab.setTabListener(mTabListener);
- getActionBar().addTab(tab);
- }
- private void setupTest4(){
- Tab tab = this.getActionBar().newTab();
- tab.setContentDescription("Tab 4");
- tab.setText("Tab 4");
- tab.setTabListener(mTabListener);
- getActionBar().addTab(tab);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_main, menu);
- return true;
- }
- private final TabListener mTabListener = new TabListener() {
- private final static String TAG = "TabListener";
- @Override
- public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
- // TODO Auto-generated method stub
- Log.d(TAG, "onTabReselected");
- }
- @Override
- public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
- // TODO Auto-generated method stub
- Log.d(TAG, "onTabSelected()");
- if (mViewPager != null)
- mViewPager.setCurrentItem(tab.getPosition());
- }
- @Override
- public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {
- // TODO Auto-generated method stub
- Log.d(TAG, "onTabUnselected()");
- }
- };
- class TestPagerListener implements OnPageChangeListener{
- @Override
- public void onPageScrollStateChanged(int arg0) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onPageScrolled(int arg0, float arg1, int arg2) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onPageSelected(int arg0) {
- getActionBar().selectTab(getActionBar().getTabAt(arg0));
- }
- }
- }
setupTab*展示了如何获取ActionBar,如何创建和添加Tab组件到ActionBar中。
注意setTabListener这个接口,我们是必须设的,否则要报错,在看一下TabListener的实现,我们只在onTabSelected中写了一句代码,就是要求ViewPager显示出对应位置的Fragment。
oncreate 中的NAVIGATION_MODE_TABS定义了ActionBar的模式,后面两名是隐藏Tilte bar。
ViewPager是一个容器,用来放Fragment,我们需要在FragmentActivity中添加它,我加在layout文件中的:
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <com.example.fragmenttest.TestViewPage
- android:id="@+id/pager"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- />
- </RelativeLayout>
TestViewPager是ViewPager的一个子类,实现代码如下:
- package com.example.fragmenttest;
- import android.content.Context;
- import android.support.v4.view.ViewPager;
- import android.util.AttributeSet;
- public class TestViewPage extends ViewPager{
- public TestViewPage(Context context) {
- super(context);
- }
- public TestViewPage(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- }
再看一下getFragmentManager()和getSupportFragmentManager()这两个接口,它们的区别是,前者调用Android框架的FragmentManger,后者是获取Android扩展库中的V4的Support FragmentManager,着为独立的APP只能用后者,原因android.jar包中没有前者的实现。
我们再看看TestViewPagerAdapter的代码:
- package com.example.fragmenttest;
- import android.support.v4.app.Fragment;
- import android.support.v4.app.FragmentManager;
- import android.support.v4.app.FragmentPagerAdapter;
- public class TestViewPagerAdapter extends FragmentPagerAdapter {
- public TestViewPagerAdapter(FragmentManager fm) {
- super(fm);
- // TODO Auto-generated constructor stub
- }
- @Override
- public Fragment getItem(int arg0) {
- // TODO Auto-generated method stub
- switch (arg0) {
- case MainActivity.TAB_INDEX_TAB_1:
- return new Tab1Fragment();
- case MainActivity.TAB_INDEX_TAB_2:
- return new Tab2Fragment();
- case MainActivity.TAB_INDEX_TAB_3:
- return new Tab3Fragment();
- case MainActivity.TAB_INDEX_TAB_4:
- return new Tab4Fragment();
- }
- throw new IllegalStateException("No fragment at position " + arg0);
- }
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return MainActivity.TAB_COUNT;
- }
- }
其实这个类就是关联ViewPager和Fragment,注意这些Index。
可能有的同学还是想看一下Fragment的实现:
- package com.example.fragmenttest;
- import android.os.Bundle;
- import android.support.v4.app.Fragment;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- public class Tab1Fragment extends Fragment {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View fragmentView = inflater.inflate(R.layout.tab1_fragment_layout, container, false);
- return fragmentView;
- }
- }
至于里面的layout就随便放了。
我们再回到FragmentActivity的onCreate, 我们看一下OnPageChangeListener,比较关键的就是onPageSelected里面的这句代码,它是实现Page切换时Tab也会切换,否则Tab和Fragment动作不一致。
很简单的一篇文章,对还没有理解到这种流程的同学提供一点帮助。
最后上个效果图吧!
转载:http://blog.csdn.net/cs_lht/article/details/8090643
另外推荐一篇写的不错ViewPager:(利用ViewPager实现可左右滑动的Action Tab)http://blog.csdn.net/ixiaobu/article/details/8154007