Android经典底部选项卡集成方式之二
2015-10-16 21:38
441 查看
此中方式的设计模式是:RadioGroup+RadioButton+ViewPager+Fragment。
其效果和我上一篇博客描写的效果是基本相同的,再次就不再上效果图了,直接上源代码。
先看布局:
再看Activity中的代码:
另外需要提醒的是:
由于viewpager自身带有左右滑动的效果,所以用以上代码形成的结果就是当点击底部选项卡的时候,页面会切换。点击页面中间部分也可以左右滑动切换页面。如果想只有当点击底部选项卡的时候才能做页面切换(即相当于禁止viewpager左右滑动),用到事件的传递机制。重写onInterceptTouchEvent和onTouchEvent两个方法:
自定义一个NoSlideViewPager extends ViewPager,代码如下:
将代码中的ViewPager替换为NoSlideViewPager ,结果就是只能通过底点击底部选项卡切换页面,viewpager不再可以自己滑动了。
其效果和我上一篇博客描写的效果是基本相同的,再次就不再上效果图了,直接上源代码。
先看布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".BottomActivity" > <android.support.v4.view.ViewPager android:id="@+id/vp" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" /> <RadioGroup android:id="@+id/rg" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/bottom_tab_bg" android:gravity="center_vertical" android:orientation="horizontal" > <RadioButton android:id="@+id/rb1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:button="@null" android:drawableTop="@drawable/selector_home" android:gravity="center" android:text="选项1" android:textColor="@color/selector_color_text" /> <RadioButton android:id="@+id/rb2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:button="@null" android:drawableTop="@drawable/selector_center" android:gravity="center" android:text="选项2" android:textColor="@color/selector_color_text" /> <RadioButton android:id="@+id/rb3" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:button="@null" android:drawableTop="@drawable/selector_smartservice" android:gravity="center" android:text="选项3" android:textColor="@color/selector_color_text" /> <RadioButton android:id="@+id/rb4" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:button="@null" android:drawableTop="@drawable/selector_gov" android:gravity="center" android:text="选项4" android:textColor="@color/selector_color_text" /> <RadioButton android:id="@+id/rb5" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:button="@null" android:drawableTop="@drawable/selector_setting" android:gravity="center" android:text="选项5" android:textColor="@color/selector_color_text" /> </RadioGroup> </LinearLayout>
再看Activity中的代码:
public class BottomActivity extends FragmentActivity { private ArrayList<Fragment> fragmentsList = new ArrayList<Fragment>(); private ViewPager mViewPager; private RadioGroup group; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bottom); mViewPager = (ViewPager) findViewById(R.id.vp); FragmentPagerAdapter adapter = new MyFragmentPageAdapter( getSupportFragmentManager()); mViewPager.setAdapter(adapter); group = (RadioGroup) findViewById(R.id.rg); OnCheckedChangeListener listener = new MyOnCheckedChangeListener(); group.setOnCheckedChangeListener(listener); group.check(R.id.rb5); // 为mViewPager设置监听,使得滑动的时候,底部也跟着跳转 OnPageChangeListener listener1 = new MyOnPageChangeListener(); mViewPager.setOnPageChangeListener(listener1); } private class MyOnPageChangeListener implements OnPageChangeListener { @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int arg0) { // 当page滑动到某一个页面的时候,底部也跟着 switch (arg0) { case 0: group.check(R.id.rb1); break; case 1: group.check(R.id.rb2); break; case 2: group.check(R.id.rb3); break; case 3: group.check(R.id.rb4); break; case 4: group.check(R.id.rb5); break; default: break; } } } private class MyOnCheckedChangeListener implements OnCheckedChangeListener { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.rb1:// viewpager跳转到此页 mViewPager.setCurrentItem(0); break; case R.id.rb2: mViewPager.setCurrentItem(1); break; case R.id.rb3: mViewPager.setCurrentItem(2); break; case R.id.rb4: mViewPager.setCurrentItem(3); break; case R.id.rb5: mViewPager.setCurrentItem(4); break; default: break; } } } private class MyFragmentPageAdapter extends FragmentPagerAdapter { public MyFragmentPageAdapter(FragmentManager fm) { super(fm); fragmentsList.add(new Fragment1()); fragmentsList.add(new Fragment2()); fragmentsList.add(new Fragment3()); fragmentsList.add(new Fragment4()); fragmentsList.add(new Fragment5()); } @Override public Fragment getItem(int arg0) { return fragmentsList.get(arg0); } @Override public int getCount() { return fragmentsList.size(); } } }
另外需要提醒的是:
由于viewpager自身带有左右滑动的效果,所以用以上代码形成的结果就是当点击底部选项卡的时候,页面会切换。点击页面中间部分也可以左右滑动切换页面。如果想只有当点击底部选项卡的时候才能做页面切换(即相当于禁止viewpager左右滑动),用到事件的传递机制。重写onInterceptTouchEvent和onTouchEvent两个方法:
自定义一个NoSlideViewPager extends ViewPager,代码如下:
public class NoSlideViewPager extends ViewPager { public NoSlideViewPager(Context context, AttributeSet attrs) { super(context, attrs); } public NoSlideViewPager(Context context) { super(context); } @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { // 是否拦截事件:true:拦截的话事件就交给自己处理 // false 就是不拦截,交给子类的view处理 return false; } @Override public boolean onTouchEvent(MotionEvent arg0) { // 返回值true:自己消费处理 // 返回值false:自己不消费处理,继续回传 return false; } }
将代码中的ViewPager替换为NoSlideViewPager ,结果就是只能通过底点击底部选项卡切换页面,viewpager不再可以自己滑动了。
相关文章推荐
- Android Fragment碎片使用方法汇总
- android TextView自动滚动以及Java中改变显示内容
- Android 旋转字体 实现(应用角标,如:新,火等关键字)
- Android数据缓存(转)
- android 17 activity生命周期
- 以Android环境为例的多线程学习笔记———-Callable与Future
- android学习
- Android学习之Activity生命周期
- android学习资源
- Android性能优化之GPU过度绘制与图形渲染优化
- Android的十六进制颜色值
- Android视频技术点
- Ubuntu下Android开发环境的搭建
- Android基础入门教程——8.3.2 绘图类实战示例
- Android apk反编译及AS代码混淆方法
- android 图片点击一下就放大到全屏,再点一下就回到原界面
- android资源文件说明
- Android应用开发性能优化完全分析
- Android监听键盘显示和隐藏
- Android ViewGroup系列控件的使用