3.复杂的viewpager

实现这样的效果:
1.主页面布局
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <com.itheima.zhbj52.view.NoScrollViewPager
  7. android:id="@+id/vp_content"
  8. android:layout_width="match_parent"
  9. android:layout_height="0dp"
  10. android:layout_weight="1" />
  11. <RadioGroup
  12. android:id="@+id/rg_group"
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:background="@drawable/bottom_tab_bg"
  16. android:orientation="horizontal" >
  17. <RadioButton
  18. android:id="@+id/rb_home"
  19. style="@style/BottomTabStyle"
  20. android:drawableTop="@drawable/btn_tab_home_selector"
  21. android:text="首页" />
  22. <RadioButton
  23. android:id="@+id/rb_news"
  24. style="@style/BottomTabStyle"
  25. android:drawableTop="@drawable/btn_tab_news_selector"
  26. android:text="新闻中心" />
  27. <RadioButton
  28. android:id="@+id/rb_smart"
  29. style="@style/BottomTabStyle"
  30. android:drawableTop="@drawable/btn_tab_smart_selector"
  31. android:text="智慧服务" />
  32. <RadioButton
  33. android:id="@+id/rb_gov"
  34. style="@style/BottomTabStyle"
  35. android:drawableTop="@drawable/btn_tab_gov_selector"
  36. android:text="政务" />
  37. <RadioButton
  38. android:id="@+id/rb_setting"
  39. style="@style/BottomTabStyle"
  40. android:drawableTop="@drawable/btn_tab_setting_selector"
  41. android:text="设置" />
  42. </RadioGroup>
  43. </LinearLayout>
因为不想让侧边栏每个页面都跑出来可以设置它不能滑动,这是一个自定义view,所以写全称。有点页面需要能滑出来,在代码中实现。注意:这俩个构造函数缺一不可
  1. /**
  2. * 不能左右划的ViewPager
  3. *
  4. * @author Kevin
  5. *
  6. */
  7. public class NoScrollViewPager extends ViewPager {

  8. public NoScrollViewPager(Context context, AttributeSet attrs) {
  9. super(context, attrs);
  10. }
  11. public NoScrollViewPager(Context context) {
  12. super(context);
  13. }
  14. // 表示事件是否拦截, 返回false表示不拦截,否则viewpager里面再有一个viewpager就会不能滑动
  15. @Override
  16. public boolean onInterceptTouchEvent(MotionEvent arg0) {
  17. return false;
  18. }
  19. /**
  20. * 重写onTouchEvent事件,什么都不用做,不滑动
  21. */
  22. @Override
  23. public boolean onTouchEvent(MotionEvent arg0) {
  24. return false;
  25. }
  26. }
底栏RadioButton的样式
  1. <style name="BottomTabStyle">
  2. <item name="android:layout_width">wrap_content</item>
  3. <item name="android:layout_height">wrap_content</item>
  4. <item name="android:layout_gravity">center_vertical</item>
  5. <item name="android:button">@null</item>//写成null,RadioButton就没有点只有文字了
  6. <item name="android:drawablePadding">3dp</item>
  7. <item name="android:padding">5dp</item>
  8. <item name="android:textColor">@drawable/btn_tab_text_selector</item>
  9. <item name="android:layout_weight">1</item>
  10. <item name="android:gravity">center</item>
  11. </style>

2.主界面

  1. public class ContentFragment extends BaseFragment {
  2. //这是注解,xuils自带这个功能,不需要findviewbyid和写各种监听事件
  3. @ViewInject(R.id.rg_group)
  4. private RadioGroup rgGroup;
  5. //不用注解的话,记得要找出控件,找了一天这个问题
  6. @ViewInject(R.id.vp_content)
  7. private ViewPager mViewPager;
  8. private ArrayList<BasePager> mPagerList;
  9. @Override
  10. public View initViews() {
  11. View view = View.inflate(mActivity, R.layout.fragment_content, null);
  12. // rgGroup = (RadioGroup) view.findViewById(R.id.rg_group);
  13. ViewUtils.inject(this, view); // 注入view和事件
  14. return view;
  15. }
  16. @Override
  17. public void initData() {
  18. // 默认勾选首页。这里没有监听事件就可以显示默认勾选首页
  19. rgGroup.check(R.id.rb_home);
  20. // 初始化5个子页面
  21. mPagerList = new ArrayList<BasePager>();
  22. // for (int i = 0; i < 5; i++) {
  23. // BasePager pager = new BasePager(mActivity);
  24. // mPagerList.add(pager);
  25. // }
  26. mPagerList.add(new HomePager(mActivity));
  27. mPagerList.add(new NewsCenterPager(mActivity));
  28. mPagerList.add(new SmartServicePager(mActivity));
  29. mPagerList.add(new GovAffairsPager(mActivity));
  30. mPagerList.add(new SettingPager(mActivity));
  31. mViewPager.setAdapter(new ContentAdapter());
  32. // 监听RadioGroup的选择事件
  33. rgGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
  34. @Override
  35. public void onCheckedChanged(RadioGroup group, int checkedId) {
  36. switch (checkedId) {
  37. case R.id.rb_home:
  38. // mViewPager.setCurrentItem(0);// 设置当前页面
  39. mViewPager.setCurrentItem(0, false);// 去掉切换页面的动画
  40. break;
  41. case R.id.rb_news:
  42. mViewPager.setCurrentItem(1, false);// 设置当前页面
  43. break;
  44. case R.id.rb_smart:
  45. mViewPager.setCurrentItem(2, false);// 设置当前页面
  46. break;
  47. case R.id.rb_gov:
  48. mViewPager.setCurrentItem(3, false);// 设置当前页面
  49. break;
  50. case R.id.rb_setting:
  51. mViewPager.setCurrentItem(4, false);// 设置当前页面
  52. break;
  53. default:
  54. break;
  55. }
  56. }
  57. });
  58. mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
  59. @Override
  60. public void onPageSelected(int arg0) {
  61. mPagerList.get(arg0).initData();// 获取当前被选中的页面, 初始化该页面数据
  62. }
  63. @Override
  64. public void onPageScrolled(int arg0, float arg1, int arg2) {
  65. }
  66. @Override
  67. public void onPageScrollStateChanged(int arg0) {
  68. }
  69. });
  70. // 初始化首页数据,得写这一步要不然不显示页面了
  71. mPagerList.get(0).initData();
  72. }
  73. class ContentAdapter extends PagerAdapter {
  74. @Override
  75. public int getCount() {
  76. return mPagerList.size();
  77. }
  78. @Override
  79. public boolean isViewFromObject(View arg0, Object arg1) {
  80. return arg0 == arg1;
  81. }
  82. @Override
  83. public Object instantiateItem(ViewGroup container, int position) {
  84. BasePager pager = mPagerList.get(position);
  85. container.addView(pager.mRootView);
  86. // pager.initData();// 初始化数据.... 不要放在此处初始化数据, 否则会预加载下一个页面
  87. return pager.mRootView;
  88. }
  89. @Override
  90. public void destroyItem(ViewGroup container, int position, Object object) {
  91. container.removeView((View) object);
  92. }
  93. }
  94. /**
  95. * 获取新闻中心页面
  96. *
  97. * @return
  98. */
  99. public NewsCenterPager getNewsCenterPager() {
  100. return (NewsCenterPager) mPagerList.get(1);
  101. }
  102. }
3.各个子页面
base_pager布局
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical" >
  5. <RelativeLayout
  6. android:layout_width="match_parent"
  7. android:layout_height="wrap_content"
  8. android:background="@drawable/title_red_bg" >
  9. <TextView
  10. android:id="@+id/tv_title"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:layout_centerHorizontal="true"
  14. android:layout_centerVertical="true"
  15. android:text="智慧北京"
  16. android:textColor="#fff"
  17. android:textSize="22sp" />
  18. <ImageButton
  19. android:id="@+id/btn_menu"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:layout_centerVertical="true"
  23. android:layout_marginLeft="5dp"
  24. android:background="@null"//图片就没有背景色了
  25. android:src="@drawable/img_menu" />
  26. </RelativeLayout>
  27. <FrameLayout
  28. android:id="@+id/fl_content"
  29. android:layout_width="match_parent"
  30. android:layout_height="0dp"
  31. android:layout_weight="1" >
  32. </FrameLayout>
  33. </LinearLayout>
子页面的共性抽成一个基类,让子页面继承它
  1. public class BasePager {
  2. public Activity mActivity;
  3. public View mRootView;// 布局对象
  4. public TextView tvTitle;// 标题对象
  5. public FrameLayout flContent;// 内容
  6. public ImageButton btnMenu;// 菜单按钮
  7. //构造函数,让它一创建出来就Activity ,并且初始化界面
  8. public BasePager(Activity activity) {
  9. mActivity = activity;
  10. initViews();
  11. }
  12. /**
  13. * 初始化布局
  14. */
  15. public void initViews() {
  16. mRootView = View.inflate(mActivity, R.layout.base_pager, null);
  17. tvTitle = (TextView) mRootView.findViewById(R.id.tv_title);
  18. flContent = (FrameLayout) mRootView.findViewById(R.id.fl_content);
  19. btnMenu = (ImageButton) mRootView.findViewById(R.id.btn_menu);
  20. btnMenu.setOnClickListener(new OnClickListener() {
  21. @Override
  22. public void onClick(View v) {
  23. toggleSlidingMenu();
  24. }
  25. });
  26. }
  27. /**
  28. * 切换SlidingMenu的状态
  29. *
  30. * @param b
  31. */
  32. protected void toggleSlidingMenu() {
  33. MainActivity mainUi = (MainActivity) mActivity;
  34. SlidingMenu slidingMenu = mainUi.getSlidingMenu();
  35. slidingMenu.toggle();// 切换状态, 显示时隐藏, 隐藏时显示
  36. }
  37. /**
  38. * 初始化数据
  39. */
  40. public void initData() {
  41. }
  42. /**
  43. * 设置侧边栏开启或关闭
  44. * TRUE显示,FALSE隐藏
  45. * @param enable
  46. */
  47. public void setSlidingMenuEnable(boolean enable) {
  48. MainActivity mainUi = (MainActivity) mActivity;
  49. //获取到MainActivity,然后getSlidingMenu就能获取侧边栏对象
  50. SlidingMenu slidingMenu = mainUi.getSlidingMenu();
  51. if (enable) {
  52. slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
  53. } else {
  54. slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
  55. }
  56. }
  57. }
子布局
  1. public class HomePager extends BasePager {
  2. public HomePager(Activity activity) {
  3. super(activity);
  4. }
  5. @Override
  6. public void initData() {
  7. System.out.println("初始化首页数据....");
  8. tvTitle.setText("智慧北京");// 修改标题
  9. // 隐藏菜单按钮图片,不写就显示出来了,在布局文件中是有这个图片按钮的
  10. btnMenu.setVisibility(View.GONE);
  11. setSlidingMenuEnable(false);//关闭侧边栏
  12. TextView text = new TextView(mActivity);
  13. text.setText("首页");
  14. text.setTextColor(Color.RED);
  15. text.setTextSize(25);
  16. text.setGravity(Gravity.CENTER);
  17. // 向FrameLayout中动态添加布局,这个是下面的标题下面的fargment
  18. flContent.addView(text);
  19. }
  20. }






posted @ 2015-10-27 21:18  梦和远方  阅读(220)  评论(0编辑  收藏  举报