Android ViewPager+Fragment滑动选项卡,tab点击选项卡

有一段时间一直再研究这个,自Android 3.0以后,很少开发者再用以前的TabWidget控件了。那种效果不是很好,也不能滑动。后来陆续出现了各种各样滑动选项卡,每种的出现都各有优势吧。但我还是推荐ViewPager+Fragment滑动选项卡,tab点击选项卡。因为横屏或者竖屏效果都还不错,针对这种效果,还有一种开源框架的出现。接下来会有所介绍。

转载请注明出处:http://blog.csdn.net/qq_16064871

本文demo下载:请点击

一、ViewPagerActivity

这里面主要有ViewPager页面选项卡,以及ActionBar.Tab页面标签。要进行同步变化以及选择。ViewPager选项卡可以滑动,里面装载是Fragment。Fragment也是有自已的布局的以及生命周期。接下来看代码以及注释。

[java]  view plain  copy
  1. package com.example.viewpagerfragmentdemo;  
  2.   
  3. import java.util.ArrayList;  
  4. import android.os.Build;  
  5. import android.os.Bundle;  
  6. import android.annotation.SuppressLint;  
  7. import android.annotation.TargetApi;  
  8. import android.app.ActionBar;  
  9. import android.app.ActionBar.Tab;  
  10. import android.app.ActionBar.TabListener;  
  11. import android.app.FragmentTransaction;  
  12. import android.support.v4.app.Fragment;  
  13. import android.support.v4.app.FragmentActivity;  
  14. import android.support.v4.app.FragmentManager;  
  15. import android.support.v4.app.FragmentPagerAdapter;  
  16. import android.support.v4.view.ViewPager;  
  17. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  18. import android.view.View;  
  19. import android.view.ViewGroup;  
  20.   
  21. @SuppressLint("NewApi")  
  22. public class ViewPagerActivity extends FragmentActivity implements  
  23.         OnPageChangeListener, TabListener {  
  24.   
  25.     private ViewPager mPager;  
  26.     private ArrayList<Fragment> mfragmentList;  
  27.     // 标题列表  
  28.     ArrayList<String> titleList = new ArrayList<String>();  
  29.   
  30.     @Override  
  31.     protected void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.   
  34.         setContentView(R.layout.activity_view_pager);  
  35.   
  36.         initViewPager();  
  37.     }  
  38.   
  39.     @TargetApi(Build.VERSION_CODES.HONEYCOMB)  
  40.     private void initViewPager() {  
  41.         mPager = (ViewPager) findViewById(R.id.viewpager);  
  42.   
  43.         mfragmentList = new ArrayList<Fragment>();  
  44.         mfragmentList.add(new FragmentTest1());  
  45.         mfragmentList.add(new FragmentTest2());  
  46.         mfragmentList.add(new FragmentTest3());  
  47.   
  48.         mPager.setAdapter(new MyViewPagerAdapter(getSupportFragmentManager(),mfragmentList));  
  49.         mPager.setCurrentItem(0);     
  50.         mPager.setOnPageChangeListener(this);  
  51.   
  52.         getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  
  53.         getActionBar().setBackgroundDrawable(  
  54.                 getResources().getDrawable(R.drawable.title_bar_shape));  
  55.         // 初始化TAB属性  
  56.         String[] tabName = null;  
  57.         String[] temTabName = { "第一页 ""第二页""第三页 " };  
  58.         tabName = temTabName;  
  59.   
  60.         for (int i = 0; i < tabName.length; i++) {  
  61.             ActionBar.Tab tab = getActionBar().newTab();  
  62.             tab.setText(tabName[i]);  
  63.             tab.setTabListener(this);  
  64.             tab.setTag(i);  
  65.             getActionBar().addTab(tab);  
  66.         }  
  67.     }  
  68.   
  69.     //三个页面选项卡Fragment适配器  
  70.     public class MyViewPagerAdapter extends FragmentPagerAdapter {  
  71.         ArrayList<Fragment> list;  
  72.   
  73.         public MyViewPagerAdapter(FragmentManager fManager,  
  74.                 ArrayList<Fragment> arrayList) {  
  75.             super(fManager);  
  76.             this.list = arrayList;  
  77.         }  
  78.   
  79.         @Override  
  80.         public int getCount() {  
  81.             return list == null ? 0 : list.size();  
  82.         }  
  83.   
  84.         @Override  
  85.         public Fragment getItem(int arg0) {  
  86.   
  87.             return list.get(arg0);  
  88.         }  
  89.   
  90.         @Override  
  91.         public int getItemPosition(Object object) {  
  92.             return POSITION_NONE;  
  93.         }  
  94.   
  95.         @Override  
  96.         public boolean isViewFromObject(View view, Object obj) {  
  97.             return view == ((Fragment) obj).getView();  
  98.         }  
  99.   
  100.         @Override  
  101.         public void destroyItem(ViewGroup container, int position, Object object) {  
  102.   
  103.         }  
  104.   
  105.     }  
  106.   
  107.     @Override  
  108.     public void onPageScrollStateChanged(int arg0) {  
  109.         // TODO Auto-generated method stub  
  110.   
  111.     }  
  112.   
  113.     @Override  
  114.     public void onPageScrolled(int arg0, float arg1, int arg2) {  
  115.         // TODO Auto-generated method stub  
  116.   
  117.     }  
  118.   
  119.     @Override  
  120.     public void onPageSelected(int arg0) {  
  121.         //滑动ViewPager的时候设置相对应的ActionBar Tab被选中    
  122.         getActionBar().getTabAt(arg0).select();  
  123.   
  124.     }  
  125.   
  126.     @Override  
  127.     public void onTabReselected(Tab arg0, FragmentTransaction arg1) {  
  128.         // TODO Auto-generated method stub  
  129.   
  130.     }  
  131.   
  132.     @Override  
  133.     public void onTabSelected(Tab tab, FragmentTransaction arg1) {  
  134.         if (tab.getTag() == null)  
  135.             return;  
  136.         //选中tab,滑动选项卡  
  137.         int index = ((Integer) tab.getTag()).intValue();  
  138.         if (mPager != null && mPager.getChildCount() > 0  
  139.                 && mfragmentList.size() > index)  
  140.             mPager.setCurrentItem(index);  
  141.     }  
  142.   
  143.     @Override  
  144.     public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {  
  145.         // TODO Auto-generated method stub  
  146.   
  147.     }  
  148.   
  149. }  
二、activity_view_pager布局

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <android.support.v4.view.ViewPager  
  9.         android:id="@+id/viewpager"  
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="fill_parent"  
  12.         android:flipInterval="30"  
  13.         android:persistentDrawingCache="animation" />  
  14. </LinearLayout>  
三、FragmentTest1

过程中使用到的FragmentTest1都是继承Fragment。这个类的生命周期跟activity很相似,是跟随着activity生命周期,activity消失,Fragment也会消失。

[java]  view plain  copy
  1. package com.example.viewpagerfragmentdemo;  
  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 FragmentTest1 extends Fragment{  
  10.   
  11.     @Override  
  12.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  13.             Bundle savedInstanceState) {  
  14.          View rootView = inflater.inflate(R.layout.fragment1, container, false);//关联布局文件  
  15.   
  16.         return rootView;  
  17.     }  
  18.   
  19.     @Override  
  20.     public void onDestroy() {  
  21.         super.onDestroy();  
  22.     }  
  23.   
  24.     @Override  
  25.     public void onPause() {  
  26.         super.onPause();  
  27.     }  
  28.   
  29.     @Override  
  30.     public void onResume() {  
  31.         super.onResume();  
  32.     }  
  33.   
  34.     @Override  
  35.     public void onStart() {  
  36.         super.onStart();  
  37.     }  
  38.   
  39.     @Override  
  40.     public void onStop() {  
  41.         super.onStop();  
  42.     }  
  43.   
  44. }  
四、效果图

竖屏


横屏



在这里第一张图可以看到tab标题栏是黑色,是系统自带的颜色,那要怎样修改呢?看这张图片以及xml


上图中红色箭头指向的,代码如下。

[html]  view plain  copy
  1. <resources>  
  2.   
  3.     <!--  
  4.         Base application theme for API 14+. This theme completely replaces  
  5.         AppBaseTheme from BOTH res/values/styles.xml and  
  6.         res/values-v11/styles.xml on API 14+ devices.  
  7.   
  8.   
  9.     -->  
  10.     <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">  
  11.     <!-- 默认是黑色的,这里设置tab的颜色 -->  
  12.     <item name="android:background">#ff1ea8e8</item>    
  13.     </style>  
  14.   
  15. </resources>  
五、修改后效果图



在这里我只是简单提供了修改tab颜色方法,具体修改还是要设计整个app设计,主题样式问题。具体需要怎样的效果,各位有需要可以去尝试。

其实,为了更好的效果,出现了标题栏开源框架使用。可以看这篇博客:Android 开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端

转载请注明出处:http://blog.csdn.net/qq_16064871

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值