1.在RadioGroup即底部菜单上方创建ViewPager
fragment_home.xml
<!-- layout_above : 在那个控件的上方 -->
<android.support.v4.view.ViewPager android:id="@+id/vp_homefragment_viewpager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/rg_homefragment_radiogroup" ></android.support.v4.view.ViewPager>
创建pager页面为普通的java类的原因
因为viewpager中添加的只能是view对象,所以可以在pager页面中增加initView方法获取pager页面的view对象,
这样pager页面既不用继承什么activity之类操作,又可以获取布局的view对象,添加到viewpager中显示
1.创建pager界面
public class Homepager{}2.因为每个pager页面都要显示布局和加载数据,所以相同抽取到父类
public abstract class BasePager {}继承父类
ublic class Homepager extends BasePager{}3.因为父类不知道子类要加载什么数据和显示什么界面,所以创建抽象类,让子类根据自己特性实现
/** * 显示布局 * @return */ public abstract View initView(); /** * 显示数据 */ public abstract void initData(); public View getRootView(){ return view; }3.2子类实现抽象方法
@Override public View initView() { TextView textView = new TextView(context); textView.setText("首页"); textView.setTextSize(25); textView.setTextColor(Color.RED); textView.setGravity(Gravity.CENTER); return textView; } @Override public void initData() { }4.因为每个子类多需要context上下文,所以可以通过pager的构造函数在new界面的时候传递,因为每个界面都有相同的操作,所以抽取到父类
public Context context; public BasePager(Context context){ this.context = context; }
4.2子类实现
public Homepager(Context context) { super(context); }
3.显示切换界面 homefragment.java
1.添加界面到集合
//给viewpager中添加界面 pagers = new ArrayList<BasePager>(); pagers.clear(); //添加界面到集合中 pagers.add(new Homepager(context)); pagers.add(new NewsCenterPager(context)); pagers.add(new SmartServicePager(context)); pagers.add(new GovPager(context)); pagers.add(new SettingPager(context));2.设置viewpager显示界面
2.1设置adapter
if (mypagerAdapter == null) { mypagerAdapter = new MyPagerAdapter(); mViewPager.setAdapter(mypagerAdapter); }else{ mypagerAdapter.notifyDataSetChanged(); }2.2 adapter操作
private class MyPagerAdapter extends PagerAdapter { //设置Viewpager条目个数 @Override public int getCount() { return pagers.size(); } //判断Viewpager页面的view对象是否与object一致 @Override public boolean isViewFromObject(View view, Object object) { return view == object; } //初始化条目,添加Viewpager条目 @Override public Object instantiateItem(ViewGroup container, int position) { //根据条目位置获取页面view对象 View rootView = pagers.get(position).getRootView(); container.addView(rootView); return rootView; } //销毁Viewpager条目操作 @Override public void destroyItem(ViewGroup container, int position, Object object) { //super.destroyItem(container, position, object); container.removeView((View) object); } }因为viewpager添加界面view对象,所以在basepager中增加获取view对象的方法
public View getRootView(){ return view; }在basepager的构造函数中调用initView方法
public BasePager(Context context){ this.context = context; view = initView(); }
3.点击按钮进行界面切换
/** * 点击按钮进行界面那切换 */ //设置默认显示界面 mRadioGroup.check(R.id.rg_homefragment_radiogroup); mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId){ case R.id.rbtn_homefragemnt_home: //首页 mViewPager.setCurrentItem(0);//设置当前显示的界面 break; case R.id.rbtn_homefragemnt_newscenter: //新闻中心 mViewPager.setCurrentItem(1); break; case R.id.rbtn_homefragemnt_smartservice: //智慧服务 mViewPager.setCurrentItem(2); break; case R.id.rbtn_homefragemnt_gov: //政务 mViewPager.setCurrentItem(3); break; case R.id.rbtn_homefragemnt_setting: //设置 mViewPager.setCurrentItem(4); break; default: break; } } });
public class NoScrollViewpager extends ViewPager { public NoScrollViewpager(Context context, AttributeSet attrs) { super(context, attrs); } public NoScrollViewpager(Context context) { super(context); } //表示不拦截子控件的事件 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub return false; } //禁止viewpager的滑动操作 @Override public boolean onTouchEvent(MotionEvent ev) { //因为不能拦截子控件的事件,所以onInterceptTouchEvent返回flase,紧接着事件往下传,但是我们执行的是viewpager的滑动事件,所以子类不执行,事件往回传,肯定会调用viewpager的 //onTouchEvent方法进行事件的执行,这里重写viewpager的onTouchEvent在里面不做任务操作,直接返回true,表示不执行操作,直接拦截事件 return true; } }