ViewPager和RadioGroup实现页面切换效果

本文介绍了如何利用ViewPager和RadioGroup在Android中实现页面切换效果。通过ViewPager的滑动特性展示多个界面,并结合RadioGroup进行底部按钮切换。文章详细讲解了关键代码实现,包括BaseFragment和BasePager的抽象类设计,以及HomeFragment的实现,展示了如何填充数据并处理用户交互。

          ViewPagerRadioGroup实现页面切换效果

1.ViewPager类提供了多界面切换的新效果,新效果有如下特征:

<1>当前显示一组界面中的其中一个界面;

<2>当用户通过左右滑动界面时,当前的屏幕显示当前界面和下一个界面的一部分;

<3>滑动结束后,界面自动跳转到当前选择的界面中。

 

2.ViewPager详细说明

Android-support-v4.jar 是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api。而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的页面导航,到页面菜单等等。官方文档api地址

http://developer.android.com/reference/android/support/v4/view/ViewPager.html

下面我们就实现一个页面内容和底部的按钮滑动切换的效果吧,本次用到了注解,所以要导入开源的项目xutillibrary

3这次只给出部分重要的核心代码,首先需要一个内容页的帧布局,用一个上面是ViewPager下面是RadioGroup的布局来替换,非常类似上次写的侧拉菜单,都是替换而已

给出MianActivity.Java的部分代码

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public void onCreate(Bundle savedInstanceState) {  
  2.         super.onCreate(savedInstanceState);  
  3.         setContentView(R.layout.content);  
  4.     //替换上面的R.layout.content帧布局  
  5.     HomeFragment homeFragment = new HomeFragment();  
  6.          getSupportFragmentManager()  
  7.          .beginTransaction()  
  8.          .replace(R.id.content_frame, homeFragment, "HOME")  
  9.          .commit();  


 

下面是要替换的布局

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >   
  6.     <android.support.v4.view.ViewPager  
  7.         android:id="@+id/layout_content"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="0dip"  
  10.         android:layout_weight="1.0" />  
  11.   
  12.     <RadioGroup  
  13.         android:id="@+id/main_radio"  
  14.         android:layout_width="fill_parent"  
  15.         android:layout_height="60dp"  
  16.         android:layout_gravity="bottom"  
  17.         android:background="@drawable/bottom_tab_bg"  
  18.         android:gravity="center_vertical"  
  19.         android:orientation="horizontal"  
  20.         android:paddingTop="2dp" >  
  21.   
  22.         <RadioButton  
  23.             android:id="@+id/rb_function"  
  24.             style="@style/main_tab_bottom"  
  25.             android:drawableTop="@drawable/icon_function"  
  26.             android:text="@string/tab_function" />  
  27.   
  28.         <RadioButton  
  29.             android:id="@+id/rb_news_center"  
  30.             style="@style/main_tab_bottom"  
  31.             android:drawableTop="@drawable/icon_newscenter"  
  32.             android:text="@string/tab_news_center" />  
  33.   
  34.         <RadioButton  
  35.             android:id="@+id/rb_smart_service"  
  36.             style="@style/main_tab_bottom"  
  37.             android:drawableTop="@drawable/icon_smartservice"  
  38.             android:text="@string/tab_smart_service" />  
  39.   
  40.         <RadioButton  
  41.             android:id="@+id/rb_gov_affairs"  
  42.             style="@style/main_tab_bottom"  
  43.             android:drawableTop="@drawable/icon_govaffairs"  
  44.             android:text="@string/tab_gov_affairs" />  
  45.   
  46.         <RadioButton  
  47.             android:id="@+id/rb_setting"  
  48.             style="@style/main_tab_bottom"  
  49.             android:drawableTop="@drawable/icon_setting"  
  50.             android:text="@string/tab_setting" />  
  51.     </RadioGroup>  
  52.   
  53. </LinearLayout>  


 

再给出HomeFragment ,它继承与BaseFragment,BaseFragment又继承于Fragment

为什么要这样写呢?便于重复使用代码,分工合作等.

这是BaseFragment,HomeFragment 的父类,具体的数据和将要显示的view由子类去实现,因为每个页面的数据和View是不同的

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public abstract class BaseFragment extends Fragment {  
  2.     public  Context context;  
  3.     public View view;  
  4.       
  5.     public abstract View initView();  
  6.     public abstract void initData();  
  7.     //初始化  
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         context =getActivity();  
  12.     }  
  13.     //xml-->View将要显示的View  
  14.     @Override  
  15.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  16.             Bundle savedInstanceState) {  
  17.         view = initView();  
  18.         return view;  
  19.     }  
  20.     //填充数据  
  21.     @Override  
  22.     public void onActivityCreated(Bundle savedInstanceState) {  
  23.         super.onActivityCreated(savedInstanceState);  
  24.         initData();  
  25.     }  
  26.       
  27. }  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.    
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 看看子类HomeFragment的代码有两个方法就是要实现父类的抽象方法  
  2. 运用到了注解的知识,其实可以用findViewById替代,但是在学知识的期间,  
  3. 自然是学得越多越好. MyViewPager 可以用ViewPager,下面是为了屏蔽预加载效果  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.    
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class HomeFragment extends BaseFragment {  
  2.     @ViewInject(R.id.layout_content)  
  3.     private MyViewPager layout_content;    
  4.     @ViewInject(R.id.main_radio)  
  5.     private RadioGroup main_radio;  
  6.     //这BasePager每个ViewPager页面的父类  
  7.     private List<BasePager> pagerList = new ArrayList<BasePager>();  
  8.       
  9.     @Override  
  10.     public View initView() {  
  11.         view = View.inflate(context, R.layout.frag_home, null);  
  12.         //通过xutil(注解,反射,代理,泛型)  
  13.         ViewUtils.inject(this, view);  
  14.         return view;  
  15.     }  
  16.   
  17.     @Override  
  18.     public void initData() {  
  19.     //通过数据适配器把ViewPager填充起来  
  20.        //;  
  21.         pagerList.clear();  
  22.         pagerList.add(new FunctionPager(context));  
  23.         pagerList.add(new NewCenterPager(context));  
  24.         pagerList.add(new SmartServicePager(context));  
  25.         pagerList.add(new GovAffarisPager(context));  
  26.         pagerList.add(new SettingPager(context));  
  27.           
  28.         layout_content.setAdapter(new MyPagerAdapter());  
  29.         main_radio.setOnCheckedChangeListener(new OnCheckedChangeListener() {             
  30.             @Override  
  31.             public void onCheckedChanged(RadioGroup group, int checkedId) {  
  32.                 //通过点击按钮显示不同的ViewPager项  
  33.                 switch (checkedId) {  
  34.                 case R.id.rb_function:  
  35.                     layout_content.setCurrentItem(0);  
  36.                     break;  
  37.                 case R.id.rb_news_center:  
  38.                     layout_content.setCurrentItem(1);  
  39.                     break;  
  40.                 case R.id.rb_smart_service:  
  41.                     layout_content.setCurrentItem(2);  
  42.                     break;  
  43.                 case R.id.rb_gov_affairs:  
  44.                     layout_content.setCurrentItem(3);  
  45.                     break;  
  46.                 case R.id.rb_setting:  
  47.                     layout_content.setCurrentItem(4);  
  48.                     break;  
  49.                 }  
  50.                   
  51.             }  
  52.         });  
  53.         //默认选中首页  
  54.         main_radio.check(R.id.rb_function);  
  55.     }  
  56.      class MyPagerAdapter extends PagerAdapter{  
  57.          
  58.             @Override  
  59.             public int getCount() {  
  60.                 return pagerList.size();  
  61.             }  
  62.             //谷歌官方推荐吧两个参数相等就OK了  
  63.             @Override  
  64.             public boolean isViewFromObject(View arg0, Object arg1) {  
  65.                 return arg0 == arg1;  
  66.             }  
  67.             //添加的每一项  
  68.              @Override  
  69.             public Object instantiateItem(ViewGroup container, int position) {  
  70.                  container.addView(pagerList.get(position).getRootView());  
  71.                  return pagerList.get(position).getRootView();  
  72.             }  
  73.              //销毁  
  74.              @Override  
  75.             public void destroyItem(ViewGroup container, int position, Object object) {  
  76.                  container.removeView((View) object);  
  77.              }  
  78.           
  79. }    
  80. }  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.    
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 再看看BasePager 的类和上面的是不是一样,具体的数据和要显示的View有子类实现  
  2. 所以FunctionPager,NewCenterPager,SmartServicePager,SettingPager,GovAffarisPager五个类只需要继承BasePager实现两个抽象方法就行了那就列举一个吧  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.    
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public abstract class BasePager {  
  2.     public View view;  
  3.     public Context context;  
  4.   public BasePager(Context context) {  
  5.      //构建单曲界面展示效果,但是父类对子类未知  
  6.       //上下文坏境需要给子类的initView()用.所以要放在上面  
  7.       this.context=context;  
  8.       view =initView();  
  9.   }  
  10.     public abstract View initView();  
  11.     public abstract void initData();  
  12.     //返回View getRootView  
  13.     public View getRootView(){  
  14.     return view;  
  15.    }  
  16. }  
  17. 给一个FunctionPager代码  
  18. package com.smart.zhbj_gaomin.base.pager;  
  19.   
  20. import android.content.Context;  
  21. import android.view.View;  
  22. import android.widget.TextView;  
  23.   
  24. import com.smart.zhbj_gaomin.base.BasePager;  
  25.   
  26. public class FunctionPager extends BasePager {  
  27.   
  28.     public FunctionPager(Context context) {  
  29.         super(context);  
  30.     }  
  31.   
  32.     @Override  
  33.     public View initView() {  
  34.         TextView textView =new TextView(context);  
  35.         textView.setText("首页");  
  36.         return textView;  
  37.     }  
  38.   
  39.     @Override  
  40.     public void initData() {  
  41.         // TODO Auto-generated method stub  
  42.   
  43.     }  
  44.   
  45. }  


 

基本核心的代码都写完了,运行起来表面没什么问题,但是ViewPager有一个特性

就是预加载功能,就是在当前页面,会预加载下一个页面,这对于此处的要求,不太好,所以要利用官方源代码,修改一个地方就好了,找到官方API,这个类LazyViewPager,修改下面,再让MyViewPager继承它就行了

 //屏蔽预加载功

    private static final int DEFAULT_OFFSCREEN_PAGES = 0;//默认viewpager当前变量的�?1

    private static final int MAX_SETTLE_DURATION = 600; //

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值