06-底部菜单按钮对应界面的具体实现

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>


2.创建按钮对应的界面

创建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.因为父类不知道子类要加载什么数据和显示什么界面,所以创建抽象类,让子类根据自己特性实现
3.1创建抽象方法
    /**
     * 显示布局
     * @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界面的时候传递,因为每个界面都有相同的操作,所以抽取到父类
4.1抽取父类

    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;
                }
            }
        });


禁止viewpager滑动操作

自定义一个viewpager重写onInterceptTouchEvent方法和onTouchEvent方法进行处理

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;
			}
	}


4.效果图:



你可能感兴趣的:(06-底部菜单按钮对应界面的具体实现)