ActionBar和Fragment结合ViewPager实现TabActivity

来源:互联网 发布:mac jdk1.7 dmg 编辑:程序博客网 时间:2024/04/30 01:40


创建FragmentActivity,总的代码如下:

[java] view plaincopy
  1. package com.example.fragmenttest;  
  2.   
  3. import android.app.ActionBar;  
  4. import android.app.ActionBar.Tab;  
  5. import android.app.ActionBar.TabListener;  
  6. import android.os.Bundle;  
  7. import android.support.v4.app.FragmentActivity;  
  8. import android.support.v4.view.ViewPager;  
  9. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  10. import android.util.Log;  
  11. import android.view.Menu;  
  12.   
  13. public class MainActivity extends FragmentActivity {  
  14.   
  15.     public final static int TAB_INDEX_TAB_1 = 0;  
  16.     public final static int TAB_INDEX_TAB_2 = 1;  
  17.     public final static int TAB_INDEX_TAB_3 = 2;  
  18.     public final static int TAB_INDEX_TAB_4 = 3;  
  19.     public final static int TAB_COUNT = 4;  
  20.   
  21.     private ViewPager mViewPager;  
  22.   
  23.     @Override  
  24.     public void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.activity_main);  
  27.   
  28.         // 创建Tab  
  29.         setupTest1();  
  30.         setupTest2();  
  31.         setupTest3();  
  32.         setupTest4();  
  33.         getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  
  34.         getActionBar().setDisplayShowTitleEnabled(false);  
  35.         getActionBar().setDisplayShowHomeEnabled(false);  
  36.   
  37.         // 创建 view pager  
  38.         mViewPager = (ViewPager)findViewById(R.id.pager);  
  39.         getFragmentManager();  
  40.   
  41.         mViewPager.setAdapter(new TestViewPagerAdapter(getSupportFragmentManager()));  
  42.         mViewPager.setOnPageChangeListener(new TestPagerListener());  
  43.         mViewPager.setCurrentItem(TAB_INDEX_TAB_2);  
  44.     }  
  45.   
  46.     private void setupTest1(){  
  47.         Tab tab = this.getActionBar().newTab();  
  48.         tab.setContentDescription("Tab 1");  
  49.         tab.setText("Tab 1");  
  50.         tab.setTabListener(mTabListener);  
  51.         getActionBar().addTab(tab);  
  52.     }  
  53.   
  54.     private void setupTest2(){  
  55.         Tab tab = this.getActionBar().newTab();  
  56.         tab.setContentDescription("Tab 2");  
  57.         tab.setText("Tab 2");  
  58.         tab.setTabListener(mTabListener);  
  59.         getActionBar().addTab(tab);  
  60.     }  
  61.   
  62.     private void setupTest3(){  
  63.         Tab tab = this.getActionBar().newTab();  
  64.         tab.setContentDescription("Tab 3");  
  65.         tab.setText("Tab 3");  
  66.         tab.setTabListener(mTabListener);  
  67.         getActionBar().addTab(tab);  
  68.     }  
  69.   
  70.     private void setupTest4(){  
  71.         Tab tab = this.getActionBar().newTab();  
  72.         tab.setContentDescription("Tab 4");  
  73.         tab.setText("Tab 4");  
  74.         tab.setTabListener(mTabListener);  
  75.         getActionBar().addTab(tab);  
  76.     }  
  77.   
  78.     @Override  
  79.     public boolean onCreateOptionsMenu(Menu menu) {  
  80.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  81.         return true;  
  82.     }  
  83.   
  84.     private final TabListener mTabListener = new TabListener() {  
  85.         private final static String TAG = "TabListener";  
  86.         @Override  
  87.         public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {  
  88.             // TODO Auto-generated method stub  
  89.             Log.d(TAG, "onTabReselected");  
  90.         }  
  91.   
  92.         @Override  
  93.         public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {  
  94.             // TODO Auto-generated method stub  
  95.             Log.d(TAG, "onTabSelected()");  
  96.             if (mViewPager != null)  
  97.                 mViewPager.setCurrentItem(tab.getPosition());  
  98.         }  
  99.   
  100.         @Override  
  101.         public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {  
  102.             // TODO Auto-generated method stub  
  103.             Log.d(TAG, "onTabUnselected()");  
  104.         }  
  105.     };  
  106.   
  107.     class TestPagerListener implements OnPageChangeListener{  
  108.         @Override  
  109.         public void onPageScrollStateChanged(int arg0) {  
  110.             // TODO Auto-generated method stub  
  111.         }  
  112.   
  113.         @Override  
  114.         public void onPageScrolled(int arg0, float arg1, int arg2) {  
  115.             // TODO Auto-generated method stub  
  116.         }  
  117.   
  118.         @Override  
  119.         public void onPageSelected(int arg0) {  
  120.             getActionBar().selectTab(getActionBar().getTabAt(arg0));  
  121.         }  
  122.     }  
  123. }  


setupTab*展示了如何获取ActionBar,如何创建和添加Tab组件到ActionBar中。

注意setTabListener这个接口,我们是必须设的,否则要报错,在看一下TabListener的实现,我们只在onTabSelected中写了一句代码,就是要求ViewPager显示出对应位置的Fragment。

oncreate 中的NAVIGATION_MODE_TABS定义了ActionBar的模式,后面两名是隐藏Tilte bar。

 

ViewPager是一个容器,用来放Fragment,我们需要在FragmentActivity中添加它,我加在layout文件中的:

[html] view plaincopy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.     <com.example.fragmenttest.TestViewPage  
  6.         android:id="@+id/pager"  
  7.         android:layout_width="match_parent"  
  8.         android:layout_height="match_parent"  
  9.         />  
  10. </RelativeLayout>  


TestViewPager是ViewPager的一个子类,实现代码如下:

[java] view plaincopy
  1. package com.example.fragmenttest;  
  2.   
  3. import android.content.Context;  
  4. import android.support.v4.view.ViewPager;  
  5. import android.util.AttributeSet;  
  6.   
  7. public class TestViewPage extends ViewPager{  
  8.       
  9.     public TestViewPage(Context context) {  
  10.         super(context);  
  11.     }  
  12.   
  13.     public TestViewPage(Context context, AttributeSet attrs) {  
  14.         super(context, attrs);  
  15.     }  
  16. }  

 

再看一下getFragmentManager()和getSupportFragmentManager()这两个接口,它们的区别是,前者调用Android框架的FragmentManger,后者是获取Android扩展库中的V4的Support FragmentManager,着为独立的APP只能用后者,原因android.jar包中没有前者的实现。

我们再看看TestViewPagerAdapter的代码:

[java] view plaincopy
  1. package com.example.fragmenttest;  
  2.   
  3. import android.support.v4.app.Fragment;  
  4. import android.support.v4.app.FragmentManager;  
  5. import android.support.v4.app.FragmentPagerAdapter;  
  6.   
  7. public class TestViewPagerAdapter extends FragmentPagerAdapter {  
  8.   
  9.     public TestViewPagerAdapter(FragmentManager fm) {  
  10.         super(fm);  
  11.         // TODO Auto-generated constructor stub  
  12.     }  
  13.   
  14.     @Override  
  15.     public Fragment getItem(int arg0) {  
  16.         // TODO Auto-generated method stub  
  17.         switch (arg0) {  
  18.         case MainActivity.TAB_INDEX_TAB_1:  
  19.             return new Tab1Fragment();  
  20.   
  21.         case MainActivity.TAB_INDEX_TAB_2:  
  22.             return new Tab2Fragment();  
  23.   
  24.         case MainActivity.TAB_INDEX_TAB_3:  
  25.             return new Tab3Fragment();  
  26.   
  27.         case MainActivity.TAB_INDEX_TAB_4:  
  28.             return new Tab4Fragment();  
  29.         }  
  30.   
  31.         throw new IllegalStateException("No fragment at position " + arg0);  
  32.     }  
  33.   
  34.     @Override  
  35.     public int getCount() {  
  36.         // TODO Auto-generated method stub  
  37.         return MainActivity.TAB_COUNT;  
  38.     }  
  39. }  


其实这个类就是关联ViewPager和Fragment,注意这些Index。

可能有的同学还是想看一下Fragment的实现:

[java] view plaincopy
  1. package com.example.fragmenttest;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v4.app.Fragment;  
  5. import android.view.LayoutInflater;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8.   
  9. public class Tab1Fragment extends Fragment {  
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         // TODO Auto-generated method stub  
  13.         super.onCreate(savedInstanceState);  
  14.     }  
  15.       
  16.     @Override  
  17.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  18.             Bundle savedInstanceState) {  
  19.         View fragmentView = inflater.inflate(R.layout.tab1_fragment_layout, container, false);  
  20.         return fragmentView;  
  21.     }  
  22. }  

至于里面的layout就随便放了。

 

我们再回到FragmentActivity的onCreate, 我们看一下OnPageChangeListener,比较关键的就是onPageSelected里面的这句代码,它是实现Page切换时Tab也会切换,否则Tab和Fragment动作不一致。

 

很简单的一篇文章,对还没有理解到这种流程的同学提供一点帮助。

最后上个效果图吧!

 


转载:http://blog.csdn.net/cs_lht/article/details/8090643

另外推荐一篇写的不错ViewPager:(利用ViewPager实现可左右滑动的Action Tabhttp://blog.csdn.net/ixiaobu/article/details/8154007


原创粉丝点击