使用ViewPager+Fragment实现选项卡切换效果

以你之姓@ 2022-07-26 11:22 261阅读 0赞

原文

http://blog.csdn.net/chdjj/article/details/21564503

主题 ViewPager

显示效果:

RJnEru.png_web3yyqqa.png_web

实现过程:

1.创建3个选项卡中的内容,即三个Fragment。

这里仅贴出其中一个:

Tab2:

  1. package com.example.viewpagerdemo3;
  2. import android.os.Bundle;
  3. import android.support.v4.app.Fragment;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.view.ViewGroup;
  8. import android.widget.Button;
  9. import android.widget.Toast;
  10. public class Tab2 extends Fragment {
  11. private Button but = null;
  12. @Override
  13. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  14. Bundle savedInstanceState)
  15. {
  16. View view = inflater.inflate(R.layout.tab2,null);//注意不要指定父视图
  17. but = (Button) view.findViewById(R.id.but);
  18. return view;
  19. }
  20. @Override
  21. public void onActivityCreated(Bundle savedInstanceState)
  22. {
  23. super.onActivityCreated(savedInstanceState);
  24. but.setOnClickListener(new OnClickListener()
  25. {
  26. @Override
  27. public void onClick(View v)
  28. {
  29. Toast.makeText(Tab2.this.getActivity(),"hahah", 0).show();
  30. }
  31. });
  32. }
  33. }

布局:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="#00ff00"
  6. android:orientation="vertical" >
  7. <TextView
  8. android:id="@+id/tab1"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:text="我是第二个界面"
  12. />
  13. <Button
  14. android:id="@+id/but"
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content"
  17. android:text="我是按钮"
  18. />
  19. </LinearLayout>

剩下两个Fragment类似。

2.主界面布局

  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. tools:context=".MainActivity" >
  7. <LinearLayout android:id="@+id/linearLayout1"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:background="#FFFFFF"
  11. android:orientation="horizontal" >
  12. <TextView android:id="@+id/text1"
  13. android:layout_width="fill_parent"
  14. android:layout_height="fill_parent"
  15. android:layout_weight="1.0"
  16. android:gravity="center"
  17. android:text="页卡1"
  18. android:textColor="#000000"
  19. android:textSize="22.0dip" />
  20. <TextView android:id="@+id/text2"
  21. android:layout_width="fill_parent"
  22. android:layout_height="fill_parent"
  23. android:layout_weight="1.0"
  24. android:gravity="center"
  25. android:text="页卡2"
  26. android:textColor="#000000"
  27. android:textSize="22.0dip" />
  28. <TextView android:id="@+id/text3"
  29. android:layout_width="fill_parent"
  30. android:layout_height="fill_parent"
  31. android:layout_weight="1.0"
  32. android:gravity="center"
  33. android:text="页卡3"
  34. android:textColor="#000000"
  35. android:textSize="22.0dip" />
  36. </LinearLayout>
  37. <ImageView android:id="@+id/cursor"
  38. android:layout_width="fill_parent"
  39. android:layout_height="wrap_content"
  40. android:scaleType="matrix"
  41. android:src="@drawable/line" />
  42. <android.support.v4.view.ViewPager android:id="@+id/vPager"
  43. android:layout_width="wrap_content"
  44. android:layout_height="wrap_content"
  45. android:layout_gravity="center"
  46. android:background="#000000"
  47. android:flipInterval="30"
  48. android:persistentDrawingCache="animation"
  49. />
  50. </LinearLayout>

三个TextView代表选项卡标题,ImageView代表选项卡下的下划线。

3.实现activity。

  1. package com.example.viewpagerdemo3; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Matrix; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.DisplayMetrics; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; import android.widget.ImageView; import android.widget.TextView; public class MainActivity extends FragmentActivity { private ViewPager vPager = null; /** * 代表选项卡下的下划线的imageview */ private ImageView cursor = null; /** * 选项卡下划线长度 */ private static int lineWidth = 0; /** * 偏移量 * (手机屏幕宽度/3-选项卡长度)/2 */ private static int offset = 0; /** * 选项卡总数 */ private static final int TAB_COUNT = 3; /** * 当前显示的选项卡位置 */ private int current_index = 0; /** * 选项卡标题 */ private TextView text1,text2,text3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); vPager = (ViewPager) findViewById(R.id.vPager); initImageView(); text1 = (TextView) findViewById(R.id.text1); text2 = (TextView) findViewById(R.id.text2); text3 = (TextView) findViewById(R.id.text3); final TextView[] titles = {text1,text2,text3}; vPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public int getCount() { return TAB_COUNT; } @Override public Fragment getItem(int index)//直接创建fragment对象并返回 { switch (index) { case 0: return new Tab1(); case 1: return new Tab2(); case 2: return new Tab3(); } return null; } }); vPager.setOnPageChangeListener(new OnPageChangeListener() { int one = offset * 2 + lineWidth;// 页卡1 -> 页卡2 偏移量 @Override public void onPageSelected(int index)//设置标题的颜色以及下划线的移动效果 { Animation animation = new TranslateAnimation(one*current_index,one*index, 0,0); animation.setFillAfter(true); animation.setDuration(300); cursor.startAnimation(animation); titles[current_index].setTextColor(Color.BLACK); titles[index].setTextColor(Color.RED); current_index = index; } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int index) { } }); } private void initImageView() { cursor = (ImageView) findViewById(R.id.cursor); //获取图片宽度 lineWidth = BitmapFactory.decodeResource(getResources(),R.drawable.line).getWidth(); DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); //获取屏幕宽度 int screenWidth = dm.widthPixels; Matrix matrix = new Matrix(); offset = (int) ((screenWidth/(float)TAB_COUNT - lineWidth)/2); matrix.postTranslate(offset, 0); //设置初始位置 cursor.setImageMatrix(matrix); } } 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41087219,本文出自:【张鸿洋的博客】 1、概述 学习Android少不了模仿各种app的界面,自从微信6.0问世以后,就觉得微信切换时那个变色的Tab图标屌屌的,今天我就带大家自定义控件,带你变色变得飞起~~ 好了,下面先看下效果图: 清晰度不太好,大家凑合看~~有木有觉得这个颜色弱爆了了的,,,下面我动动手指给你换个颜色: 有没有这个颜色比较妖一点~~~好了~下面开始介绍原理。 2、原理介绍 通过上面的效果图,大家可能也猜到了,我们的图标并非是两张图片,而是一张图,并且目标颜色是可定制的,谁让现在动不动就谈个性化呢。 那么我们如何做到,可以让图标随心所遇的变色了,其实原理,在我的博客中出现了很多次了,下面你将看到一张熟悉的图: 有没有很熟悉的感脚,我们实际上还是利用了Paint的Xfermode,这次我们使用的是:Mode.DST_IN Dst_IN回顾一下什么效果,先绘制Dst,设置Mode,再绘制Src,则显示的是先后绘图的交集区域,且是Dst. 再仔细观察下我们的图标: 为了方便大家的观看,我特意拿ps选择了一下我们图标的非透明区域,可以看到,我们这个小机器人非透明区域就是被线框起来的部分。 然后,我们图标变色的原理就出现了: 1、先绘制一个颜色(例如:粉红) 2、设置Mode=DST_IN 3、绘制我们这个可爱的小机器人 回答我,显示什么,是不是显示交集,交集是什么?交集是我们的小机器人的非透明区域,也就是那张脸,除了两个眼; 好了,那怎么变色呢? 我绘制一个颜色的时候,难道不能设置alpha么~~~ 到此,大家应该已经了解了我们图标的绘制的原理了吧。 如果你对Mode不熟悉:建议移步至:Android 自定义控件实现刮刮卡效果 真的就只是刮刮卡么 3、自定义图标控件 我们的整个界面不用说,是ViewPager+Fragment ,现在关注的是底部~~ 接下来我们考虑,底部的Tab,Tab我们的布局是LinearLayout,内部四个View,通过设置weight达到均分~~ 这个View就是我们的自定义的图标控件了,我们叫做:ChangeColorIconWithTextView 接下来考虑,应该有什么属性公布出来 1、自定义属性 想了一下,我决定把图标,图标颜色,图标下显示的文字,文字大小这四个属性作为自定义属性。 那就自定义属性走起了: a、values/attr.xml
  2. [java] view plain copy print ? <?xml version="1.0" encoding="utf-8"?> <resources> <attr name="icon" format="reference" /> <attr name="color" format="color" /> <attr name="text" format="string" /> <attr name="text_size" format="dimension" /> <declare-styleable name="ChangeColorIconView"> <attr name="icon" /> <attr name="color" /> <attr name="text" /> <attr name="text_size" /> </declare-styleable> </resources> <?xml version="1.0" encoding="utf-8"?>
  3. <resources>
  4. <attr name="icon" format="reference" />
  5. <attr name="color" format="color" />
  6. <attr name="text" format="string" />
  7. <attr name="text_size" format="dimension" />
  8. <declare-styleable name="ChangeColorIconView">
  9. <attr name="icon" />
  10. <attr name="color" />
  11. <attr name="text" />
  12. <attr name="text_size" />
  13. </declare-styleable>
  14. </resources>
  15. b、在布局文件中使用
  16. [html] view plain copy print ?
  17. <com.zhy.weixin6.ui.ChangeColorIconWithTextView android:id="@+id/id_indicator_one" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:padding="5dp" zhy:icon="@drawable/ic_menu_start_conversation" zhy:text="@string/tab_weixin" zhy:text_size="12sp" />
  18. <com.zhy.weixin6.ui.ChangeColorIconWithTextView
  19. android:id="@+id/id_indicator_one"
  20. android:layout_width="0dp"
  21. android:layout_height="fill_parent"
  22. android:layout_weight="1"
  23. android:padding="5dp"
  24. zhy:icon="@drawable/ic_menu_start_conversation"
  25. zhy:text="@string/tab_weixin"
  26. zhy:text_size="12sp" />
  27. 自己注意命名空间的写法,xmlns:zhy="http://schemas.android.com/apk/res/应用的包名" c、在构造方法中获取
  28. [java] view plain copy print ?
  29. public class ChangeColorIconWithTextView extends View { private Bitmap mBitmap; private Canvas mCanvas; private Paint mPaint; /** * 颜色 */ private int mColor = 0xFF45C01A; /** * 透明度 0.0-1.0 */ private float mAlpha = 0f; /** * 图标 */ private Bitmap mIconBitmap; /** * 限制绘制icon的范围 */ private Rect mIconRect; /** * icon底部文本 */ private String mText = "微信"; private int mTextSize = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_SP, 10, getResources().getDisplayMetrics()); private Paint mTextPaint; private Rect mTextBound = new Rect(); public ChangeColorIconWithTextView(Context context) { super(context); } /** * 初始化自定义属性值 * * @param context * @param attrs */ public ChangeColorIconWithTextView(Context context, AttributeSet attrs) { super(context, attrs); // 获取设置的图标 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ChangeColorIconView); int n = a.getIndexCount(); for (int i = 0; i < n; i++) { int attr = a.getIndex(i); switch (attr) { case R.styleable.ChangeColorIconView_icon: BitmapDrawable drawable = (BitmapDrawable) a.getDrawable(attr); mIconBitmap = drawable.getBitmap(); break; case R.styleable.ChangeColorIconView_color: mColor = a.getColor(attr, 0x45C01A); break; case R.styleable.ChangeColorIconView_text: mText = a.getString(attr); break; case R.styleable.ChangeColorIconView_text_size: mTextSize = (int) a.getDimension(attr, TypedValue .applyDimension(TypedValue.COMPLEX_UNIT_SP, 10, getResources().getDisplayMetrics())); break; } } a.recycle(); mTextPaint = new Paint(); mTextPaint.setTextSize(mTextSize); mTextPaint.setColor(0xff555555); // 得到text绘制范围 mTextPaint.getTextBounds(mText, 0, mText.length(), mTextBound); }
  30. public class ChangeColorIconWithTextView extends View
  31. {
  32. private Bitmap mBitmap;
  33. private Canvas mCanvas;
  34. private Paint mPaint;
  35. /**
  36. * 颜色
  37. */
  38. private int mColor = 0xFF45C01A;
  39. /**
  40. * 透明度 0.0-1.0
  41. */
  42. private float mAlpha = 0f;
  43. /**
  44. * 图标
  45. */
  46. private Bitmap mIconBitmap;
  47. /**
  48. * 限制绘制icon的范围
  49. */
  50. private Rect mIconRect;
  51. /**
  52. * icon底部文本
  53. */
  54. private String mText = "微信";
  55. private int mTextSize = (int) TypedValue.applyDimension(
  56. TypedValue.COMPLEX_UNIT_SP, 10, getResources().getDisplayMetrics());
  57. private Paint mTextPaint;
  58. private Rect mTextBound = new Rect();
  59. public ChangeColorIconWithTextView(Context context)
  60. {
  61. super(context);
  62. }
  63. /**
  64. * 初始化自定义属性值
  65. *
  66. * @param context
  67. * @param attrs
  68. */
  69. public ChangeColorIconWithTextView(Context context, AttributeSet attrs)
  70. {
  71. super(context, attrs);
  72. // 获取设置的图标
  73. TypedArray a = context.obtainStyledAttributes(attrs,
  74. R.styleable.ChangeColorIconView);
  75. int n = a.getIndexCount();
  76. for (int i = 0; i < n; i++)
  77. {
  78. int attr = a.getIndex(i);
  79. switch (attr)
  80. {
  81. case R.styleable.ChangeColorIconView_icon:
  82. BitmapDrawable drawable = (BitmapDrawable) a.getDrawable(attr);
  83. mIconBitmap = drawable.getBitmap();
  84. break;
  85. case R.styleable.ChangeColorIconView_color:
  86. mColor = a.getColor(attr, 0x45C01A);
  87. break;
  88. case R.styleable.ChangeColorIconView_text:
  89. mText = a.getString(attr);
  90. break;
  91. case R.styleable.ChangeColorIconView_text_size:
  92. mTextSize = (int) a.getDimension(attr, TypedValue
  93. .applyDimension(TypedValue.COMPLEX_UNIT_SP, 10,
  94. getResources().getDisplayMetrics()));
  95. break;
  96. }
  97. }
  98. a.recycle();
  99. mTextPaint = new Paint();
  100. mTextPaint.setTextSize(mTextSize);
  101. mTextPaint.setColor(0xff555555);
  102. // 得到text绘制范围
  103. mTextPaint.getTextBounds(mText, 0, mText.length(), mTextBound);
  104. }
  105. 可以看到,我们在构造方法中获取了自定义的属性,并且计算了文本占据的控件存在我们的mTextBound中。 2、图标的绘制区域的选择 我们考虑下,有了属性,我们需要绘制一个文本,文本之上一个图标,我们怎么去控制绘制的区域呢?
  106. 我们的View显示区域,无非以下三种情况:
  107. 针对这三种情况,我门的图标的边长应该是什么呢? 我觉得边长应该是:控件的高度-文本的高度-内边距 控件的宽度-内边距 两者的小值;大家仔细推敲一下; 好了,有了上面的边长的结论,我们就开始计算图标的绘制范围了:
  108. [java] view plain copy print ?
  109. @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 得到绘制icon的宽 int bitmapWidth = Math.min(getMeasuredWidth() - getPaddingLeft() - getPaddingRight(), getMeasuredHeight() - getPaddingTop() - getPaddingBottom() - mTextBound.height()); int left = getMeasuredWidth() / 2 - bitmapWidth / 2; int top = (getMeasuredHeight() - mTextBound.height()) / 2 - bitmapWidth / 2; // 设置icon的绘制范围 mIconRect = new Rect(left, top, left + bitmapWidth, top + bitmapWidth); }
  110. @Override
  111. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
  112. {
  113. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  114. // 得到绘制icon的宽
  115. int bitmapWidth = Math.min(getMeasuredWidth() - getPaddingLeft()
  116. - getPaddingRight(), getMeasuredHeight() - getPaddingTop()
  117. - getPaddingBottom() - mTextBound.height());
  118. int left = getMeasuredWidth() / 2 - bitmapWidth / 2;
  119. int top = (getMeasuredHeight() - mTextBound.height()) / 2 - bitmapWidth
  120. / 2;
  121. // 设置icon的绘制范围
  122. mIconRect = new Rect(left, top, left + bitmapWidth, top + bitmapWidth);
  123. }
  124. 3、绘制图标 绘制图标有很多步骤呀,我来列一列 1、计算alpha(默认为0 2、绘制原图 3、在绘图区域,绘制一个纯色块(设置了alpha),此步绘制在内存的bitmap 4、设置mode,针对内存中的bitmap上的paint 5、绘制我们的图标,此步绘制在内存的bitmap 6、绘制原文本 7、绘制设置alpha和颜色后的文本 8、将内存中的bitmap绘制出来 根据上面的步骤,可以看出来,我们的图标其实绘制了两次,为什么要绘制原图呢,因为我觉得比较好看。 3-5步骤,就是我们上面分析的原理 6-7步,是绘制文本,可以看到,我们的文本就是通过设置alpha实现的
  125. [java] view plain copy print ?
  126. @Override protected void onDraw(Canvas canvas) { int alpha = (int) Math.ceil((255 * mAlpha)); canvas.drawBitmap(mIconBitmap, null, mIconRect, null); setupTargetBitmap(alpha); drawSourceText(canvas, alpha); drawTargetText(canvas, alpha); canvas.drawBitmap(mBitmap, 0, 0, null); } private void setupTargetBitmap(int alpha) { mBitmap = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), Config.ARGB_8888); mCanvas = new Canvas(mBitmap); mPaint = new Paint(); mPaint.setColor(mColor); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setAlpha(alpha); mCanvas.drawRect(mIconRect, mPaint); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); mPaint.setAlpha(255); mCanvas.drawBitmap(mIconBitmap, null, mIconRect, mPaint); } private void drawSourceText(Canvas canvas, int alpha) { mTextPaint.setTextSize(mTextSize); mTextPaint.setColor(0xff333333); mTextPaint.setAlpha(255 - alpha); canvas.drawText(mText, mIconRect.left + mIconRect.width() / 2 - mTextBound.width() / 2, mIconRect.bottom + mTextBound.height(), mTextPaint); } private void drawTargetText(Canvas canvas, int alpha) { mTextPaint.setColor(mColor); mTextPaint.setAlpha(alpha); canvas.drawText(mText, mIconRect.left + mIconRect.width() / 2 - mTextBound.width() / 2, mIconRect.bottom + mTextBound.height(), mTextPaint); }
  127. @Override
  128. protected void onDraw(Canvas canvas)
  129. {
  130. int alpha = (int) Math.ceil((255 * mAlpha));
  131. canvas.drawBitmap(mIconBitmap, null, mIconRect, null);
  132. setupTargetBitmap(alpha);
  133. drawSourceText(canvas, alpha);
  134. drawTargetText(canvas, alpha);
  135. canvas.drawBitmap(mBitmap, 0, 0, null);
  136. }
  137. private void setupTargetBitmap(int alpha)
  138. {
  139. mBitmap = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(),
  140. Config.ARGB_8888);
  141. mCanvas = new Canvas(mBitmap);
  142. mPaint = new Paint();
  143. mPaint.setColor(mColor);
  144. mPaint.setAntiAlias(true);
  145. mPaint.setDither(true);
  146. mPaint.setAlpha(alpha);
  147. mCanvas.drawRect(mIconRect, mPaint);
  148. mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
  149. mPaint.setAlpha(255);
  150. mCanvas.drawBitmap(mIconBitmap, null, mIconRect, mPaint);
  151. }
  152. private void drawSourceText(Canvas canvas, int alpha)
  153. {
  154. mTextPaint.setTextSize(mTextSize);
  155. mTextPaint.setColor(0xff333333);
  156. mTextPaint.setAlpha(255 - alpha);
  157. canvas.drawText(mText, mIconRect.left + mIconRect.width() / 2
  158. - mTextBound.width() / 2,
  159. mIconRect.bottom + mTextBound.height(), mTextPaint);
  160. }
  161. private void drawTargetText(Canvas canvas, int alpha)
  162. {
  163. mTextPaint.setColor(mColor);
  164. mTextPaint.setAlpha(alpha);
  165. canvas.drawText(mText, mIconRect.left + mIconRect.width() / 2
  166. - mTextBound.width() / 2,
  167. mIconRect.bottom + mTextBound.height(), mTextPaint);
  168. }
  169. 关于绘制文本区域的计算,首先是起点xmIconRect.left + mIconRect.width() / 2- mTextBound.width() / 2 有点长哈,文本mIconRect.left + mIconRect.width() / 2这个位置,在图标水平区域的中心点,这个应该没有疑问;图标水平区域的中点- mTextBound.width() / 2 开始绘制文本,是不是就是居中在图标的下面; 有人可能会问:你怎么知道文本宽度小于图标,我有5个字咋办?5个字怎么了,照样是居中显示,不信你试试~~ 4、公布设置透明度的方法 到此,我们的图标控件写完了,但是还没有把我们的控制icon的方法放出去:
  170. [java] view plain copy print ?
  171. public void setIconAlpha(float alpha) { this.mAlpha = alpha; invalidateView(); } private void invalidateView() { if (Looper.getMainLooper() == Looper.myLooper()) { invalidate(); } else { postInvalidate(); } }
  172. public void setIconAlpha(float alpha)
  173. {
  174. this.mAlpha = alpha;
  175. invalidateView();
  176. }
  177. private void invalidateView()
  178. {
  179. if (Looper.getMainLooper() == Looper.myLooper())
  180. {
  181. invalidate();
  182. } else
  183. {
  184. postInvalidate();
  185. }
  186. }
  187. 我们叫做setIconAlpha,避免了和setAlpha冲突,设置完成后,invalidate一下~~~
  188. 到此就真的结束了,接下来看用法。
  189. 4、实战
  190. 1、布局文件
  191. [html] view plain copy print ?
  192. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:zhy="http://schemas.android.com/apk/res/com.zhy.weixin6.ui" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/id_viewpager" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" > </android.support.v4.view.ViewPager> <LinearLayout android:layout_width="fill_parent" android:layout_height="60dp" android:background="@drawable/tabbg" android:orientation="horizontal" > <com.zhy.weixin6.ui.ChangeColorIconWithTextView android:id="@+id/id_indicator_one" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:padding="5dp" zhy:icon="@drawable/ic_menu_start_conversation" zhy:text="@string/tab_weixin" zhy:text_size="12sp" /> <com.zhy.weixin6.ui.ChangeColorIconWithTextView android:id="@+id/id_indicator_two" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:padding="5dp" zhy:icon="@drawable/ic_menu_friendslist" zhy:text="@string/tab_contact" zhy:text_size="12sp" /> <com.zhy.weixin6.ui.ChangeColorIconWithTextView android:id="@+id/id_indicator_three" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:padding="5dp" zhy:icon="@drawable/ic_menu_emoticons" zhy:text="@string/tab_find" zhy:text_size="12sp" /> <com.zhy.weixin6.ui.ChangeColorIconWithTextView android:id="@+id/id_indicator_four" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:padding="5dp" zhy:icon="@drawable/ic_menu_allfriends" zhy:text="@string/tab_me" zhy:text_size="12sp" /> </LinearLayout> </LinearLayout>
  193. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  194. xmlns:zhy="http://schemas.android.com/apk/res/com.zhy.weixin6.ui"
  195. xmlns:tools="http://schemas.android.com/tools"
  196. android:layout_width="match_parent"
  197. android:layout_height="match_parent"
  198. android:orientation="vertical" >
  199. <android.support.v4.view.ViewPager
  200. android:id="@+id/id_viewpager"
  201. android:layout_width="fill_parent"
  202. android:layout_height="0dp"
  203. android:layout_weight="1" >
  204. </android.support.v4.view.ViewPager>
  205. <LinearLayout
  206. android:layout_width="fill_parent"
  207. android:layout_height="60dp"
  208. android:background="@drawable/tabbg"
  209. android:orientation="horizontal" >
  210. <com.zhy.weixin6.ui.ChangeColorIconWithTextView
  211. android:id="@+id/id_indicator_one"
  212. android:layout_width="0dp"
  213. android:layout_height="fill_parent"
  214. android:layout_weight="1"
  215. android:padding="5dp"
  216. zhy:icon="@drawable/ic_menu_start_conversation"
  217. zhy:text="@string/tab_weixin"
  218. zhy:text_size="12sp" />
  219. <com.zhy.weixin6.ui.ChangeColorIconWithTextView
  220. android:id="@+id/id_indicator_two"
  221. android:layout_width="0dp"
  222. android:layout_height="fill_parent"
  223. android:layout_weight="1"
  224. android:padding="5dp"
  225. zhy:icon="@drawable/ic_menu_friendslist"
  226. zhy:text="@string/tab_contact"
  227. zhy:text_size="12sp" />
  228. <com.zhy.weixin6.ui.ChangeColorIconWithTextView
  229. android:id="@+id/id_indicator_three"
  230. android:layout_width="0dp"
  231. android:layout_height="fill_parent"
  232. android:layout_weight="1"
  233. android:padding="5dp"
  234. zhy:icon="@drawable/ic_menu_emoticons"
  235. zhy:text="@string/tab_find"
  236. zhy:text_size="12sp" />
  237. <com.zhy.weixin6.ui.ChangeColorIconWithTextView
  238. android:id="@+id/id_indicator_four"
  239. android:layout_width="0dp"
  240. android:layout_height="fill_parent"
  241. android:layout_weight="1"
  242. android:padding="5dp"
  243. zhy:icon="@drawable/ic_menu_allfriends"
  244. zhy:text="@string/tab_me"
  245. zhy:text_size="12sp" />
  246. </LinearLayout>
  247. </LinearLayout>
  248. 2MainActivity
  249. [java] view plain copy print ?
  250. package com.zhy.weixin6.ui; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import android.annotation.SuppressLint; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewConfiguration; import android.view.Window; @SuppressLint("NewApi") public class MainActivity extends FragmentActivity implements OnPageChangeListener, OnClickListener { private ViewPager mViewPager; private List<Fragment> mTabs = new ArrayList<Fragment>(); private FragmentPagerAdapter mAdapter; private String[] mTitles = new String[] { "First Fragment!", "Second Fragment!", "Third Fragment!", "Fourth Fragment!" }; private List<ChangeColorIconWithTextView> mTabIndicator = new ArrayList<ChangeColorIconWithTextView>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setOverflowShowingAlways(); getActionBar().setDisplayShowHomeEnabled(false); mViewPager = (ViewPager) findViewById(R.id.id_viewpager); initDatas(); mViewPager.setAdapter(mAdapter); mViewPager.setOnPageChangeListener(this); } private void initDatas() { for (String title : mTitles) { TabFragment tabFragment = new TabFragment(); Bundle args = new Bundle(); args.putString("title", title); tabFragment.setArguments(args); mTabs.add(tabFragment); } mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public int getCount() { return mTabs.size(); } @Override public Fragment getItem(int arg0) { return mTabs.get(arg0); } }; initTabIndicator(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } private void initTabIndicator() { ChangeColorIconWithTextView one = (ChangeColorIconWithTextView) findViewById(R.id.id_indicator_one); ChangeColorIconWithTextView two = (ChangeColorIconWithTextView) findViewById(R.id.id_indicator_two); ChangeColorIconWithTextView three = (ChangeColorIconWithTextView) findViewById(R.id.id_indicator_three); ChangeColorIconWithTextView four = (ChangeColorIconWithTextView) findViewById(R.id.id_indicator_four); mTabIndicator.add(one); mTabIndicator.add(two); mTabIndicator.add(three); mTabIndicator.add(four); one.setOnClickListener(this); two.setOnClickListener(this); three.setOnClickListener(this); four.setOnClickListener(this); one.setIconAlpha(1.0f); } @Override public void onPageSelected(int arg0) { } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // Log.e("TAG", "position = " + position + " , positionOffset = " // + positionOffset); if (positionOffset > 0) { ChangeColorIconWithTextView left = mTabIndicator.get(position); ChangeColorIconWithTextView right = mTabIndicator.get(position + 1); left.setIconAlpha(1 - positionOffset); right.setIconAlpha(positionOffset); } } @Override public void onPageScrollStateChanged(int state) { } @Override public void onClick(View v) { resetOtherTabs(); switch (v.getId()) { case R.id.id_indicator_one: mTabIndicator.get(0).setIconAlpha(1.0f); mViewPager.setCurrentItem(0, false); break; case R.id.id_indicator_two: mTabIndicator.get(1).setIconAlpha(1.0f); mViewPager.setCurrentItem(1, false); break; case R.id.id_indicator_three: mTabIndicator.get(2).setIconAlpha(1.0f); mViewPager.setCurrentItem(2, false); break; case R.id.id_indicator_four: mTabIndicator.get(3).setIconAlpha(1.0f); mViewPager.setCurrentItem(3, false); break; } } /** * 重置其他的Tab */ private void resetOtherTabs() { for (int i = 0; i < mTabIndicator.size(); i++) { mTabIndicator.get(i).setIconAlpha(0); } } @Override public boolean onMenuOpened(int featureId, Menu menu) { if (featureId == Window.FEATURE_ACTION_BAR && menu != null) { if (menu.getClass().getSimpleName().equals("MenuBuilder")) { try { Method m = menu.getClass().getDeclaredMethod( "setOptionalIconsVisible", Boolean.TYPE); m.setAccessible(true); m.invoke(menu, true); } catch (Exception e) { } } } return super.onMenuOpened(featureId, menu); } private void setOverflowShowingAlways() { try { // true if a permanent menu key is present, false otherwise. ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class .getDeclaredField("sHasPermanentMenuKey"); menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } catch (Exception e) { e.printStackTrace(); } } }
  251. package com.zhy.weixin6.ui;
  252. import java.lang.reflect.Field;
  253. import java.lang.reflect.Method;
  254. import java.util.ArrayList;
  255. import java.util.List;
  256. import android.annotation.SuppressLint;
  257. import android.os.Bundle;
  258. import android.support.v4.app.Fragment;
  259. import android.support.v4.app.FragmentActivity;
  260. import android.support.v4.app.FragmentPagerAdapter;
  261. import android.support.v4.view.ViewPager;
  262. import android.support.v4.view.ViewPager.OnPageChangeListener;
  263. import android.view.Menu;
  264. import android.view.View;
  265. import android.view.View.OnClickListener;
  266. import android.view.ViewConfiguration;
  267. import android.view.Window;
  268. @SuppressLint("NewApi")
  269. public class MainActivity extends FragmentActivity implements
  270. OnPageChangeListener, OnClickListener
  271. {
  272. private ViewPager mViewPager;
  273. private List<Fragment> mTabs = new ArrayList<Fragment>();
  274. private FragmentPagerAdapter mAdapter;
  275. private String[] mTitles = new String[] { "First Fragment!",
  276. "Second Fragment!", "Third Fragment!", "Fourth Fragment!" };
  277. private List<ChangeColorIconWithTextView> mTabIndicator = new ArrayList<ChangeColorIconWithTextView>();
  278. @Override
  279. protected void onCreate(Bundle savedInstanceState)
  280. {
  281. super.onCreate(savedInstanceState);
  282. setContentView(R.layout.activity_main);
  283. setOverflowShowingAlways();
  284. getActionBar().setDisplayShowHomeEnabled(false);
  285. mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
  286. initDatas();
  287. mViewPager.setAdapter(mAdapter);
  288. mViewPager.setOnPageChangeListener(this);
  289. }
  290. private void initDatas()
  291. {
  292. for (String title : mTitles)
  293. {
  294. TabFragment tabFragment = new TabFragment();
  295. Bundle args = new Bundle();
  296. args.putString("title", title);
  297. tabFragment.setArguments(args);
  298. mTabs.add(tabFragment);
  299. }
  300. mAdapter = new FragmentPagerAdapter(getSupportFragmentManager())
  301. {
  302. @Override
  303. public int getCount()
  304. {
  305. return mTabs.size();
  306. }
  307. @Override
  308. public Fragment getItem(int arg0)
  309. {
  310. return mTabs.get(arg0);
  311. }
  312. };
  313. initTabIndicator();
  314. }
  315. @Override
  316. public boolean onCreateOptionsMenu(Menu menu)
  317. {
  318. getMenuInflater().inflate(R.menu.main, menu);
  319. return true;
  320. }
  321. private void initTabIndicator()
  322. {
  323. ChangeColorIconWithTextView one = (ChangeColorIconWithTextView) findViewById(R.id.id_indicator_one);
  324. ChangeColorIconWithTextView two = (ChangeColorIconWithTextView) findViewById(R.id.id_indicator_two);
  325. ChangeColorIconWithTextView three = (ChangeColorIconWithTextView) findViewById(R.id.id_indicator_three);
  326. ChangeColorIconWithTextView four = (ChangeColorIconWithTextView) findViewById(R.id.id_indicator_four);
  327. mTabIndicator.add(one);
  328. mTabIndicator.add(two);
  329. mTabIndicator.add(three);
  330. mTabIndicator.add(four);
  331. one.setOnClickListener(this);
  332. two.setOnClickListener(this);
  333. three.setOnClickListener(this);
  334. four.setOnClickListener(this);
  335. one.setIconAlpha(1.0f);
  336. }
  337. @Override
  338. public void onPageSelected(int arg0)
  339. {
  340. }
  341. @Override
  342. public void onPageScrolled(int position, float positionOffset,
  343. int positionOffsetPixels)
  344. {
  345. // Log.e("TAG", "position = " + position + " , positionOffset = "
  346. // + positionOffset);
  347. if (positionOffset > 0)
  348. {
  349. ChangeColorIconWithTextView left = mTabIndicator.get(position);
  350. ChangeColorIconWithTextView right = mTabIndicator.get(position + 1);
  351. left.setIconAlpha(1 - positionOffset);
  352. right.setIconAlpha(positionOffset);
  353. }
  354. }
  355. @Override
  356. public void onPageScrollStateChanged(int state)
  357. {
  358. }
  359. @Override
  360. public void onClick(View v)
  361. {
  362. resetOtherTabs();
  363. switch (v.getId())
  364. {
  365. case R.id.id_indicator_one:
  366. mTabIndicator.get(0).setIconAlpha(1.0f);
  367. mViewPager.setCurrentItem(0, false);
  368. break;
  369. case R.id.id_indicator_two:
  370. mTabIndicator.get(1).setIconAlpha(1.0f);
  371. mViewPager.setCurrentItem(1, false);
  372. break;
  373. case R.id.id_indicator_three:
  374. mTabIndicator.get(2).setIconAlpha(1.0f);
  375. mViewPager.setCurrentItem(2, false);
  376. break;
  377. case R.id.id_indicator_four:
  378. mTabIndicator.get(3).setIconAlpha(1.0f);
  379. mViewPager.setCurrentItem(3, false);
  380. break;
  381. }
  382. }
  383. /**
  384. * 重置其他的Tab
  385. */
  386. private void resetOtherTabs()
  387. {
  388. for (int i = 0; i < mTabIndicator.size(); i++)
  389. {
  390. mTabIndicator.get(i).setIconAlpha(0);
  391. }
  392. }
  393. @Override
  394. public boolean onMenuOpened(int featureId, Menu menu)
  395. {
  396. if (featureId == Window.FEATURE_ACTION_BAR && menu != null)
  397. {
  398. if (menu.getClass().getSimpleName().equals("MenuBuilder"))
  399. {
  400. try
  401. {
  402. Method m = menu.getClass().getDeclaredMethod(
  403. "setOptionalIconsVisible", Boolean.TYPE);
  404. m.setAccessible(true);
  405. m.invoke(menu, true);
  406. } catch (Exception e)
  407. {
  408. }
  409. }
  410. }
  411. return super.onMenuOpened(featureId, menu);
  412. }
  413. private void setOverflowShowingAlways()
  414. {
  415. try
  416. {
  417. // true if a permanent menu key is present, false otherwise.
  418. ViewConfiguration config = ViewConfiguration.get(this);
  419. Field menuKeyField = ViewConfiguration.class
  420. .getDeclaredField("sHasPermanentMenuKey");
  421. menuKeyField.setAccessible(true);
  422. menuKeyField.setBoolean(config, false);
  423. } catch (Exception e)
  424. {
  425. e.printStackTrace();
  426. }
  427. }
  428. }
  429. Activity里面代码虽然没什么注释,但是很简单哈,就是初始化Fragment,得到我们的适配器,然后设置给ViewPager initTabIndicator我们初始化我们的自定义控件,以及加上了点击事件;
  430. 唯一一个需要指出的就是: 我们在onPageScrolled中,动态的获取position以及positionOffset,然后拿到左右两个View,设置positionOffset 这里表示下惭愧,曾经在高仿微信5.2.1主界面架构 包含消息通知 onPageScrolled中写了一堆的if else,在视频上线后,也有同学立马就提出了,一行代码搞定~~ 所以,我们这里简单找了下规律,已经没有if else的身影了~~~ 还剩两个反射的方法,是控制Actionbar的图标的,和点击menu按键,将ActionBarmenu显示在正常区域的~~ 3TabFragment
  431. [java] view plain copy print ?
  432. package com.zhy.weixin6.ui; import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class TabFragment extends Fragment { private String mTitle = "Default"; public TabFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (getArguments() != null) { mTitle = getArguments().getString("title"); } TextView textView = new TextView(getActivity()); textView.setTextSize(20); textView.setBackgroundColor(Color.parseColor("#ffffffff")); textView.setGravity(Gravity.CENTER); textView.setText(mTitle); return textView; } }
  433. package com.zhy.weixin6.ui;
  434. import android.graphics.Color;
  435. import android.os.Bundle;
  436. import android.support.v4.app.Fragment;
  437. import android.view.Gravity;
  438. import android.view.LayoutInflater;
  439. import android.view.View;
  440. import android.view.ViewGroup;
  441. import android.widget.TextView;
  442. public class TabFragment extends Fragment
  443. {
  444. private String mTitle = "Default";
  445. public TabFragment()
  446. {
  447. }
  448. @Override
  449. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  450. Bundle savedInstanceState)
  451. {
  452. if (getArguments() != null)
  453. {
  454. mTitle = getArguments().getString("title");
  455. }
  456. TextView textView = new TextView(getActivity());
  457. textView.setTextSize(20);
  458. textView.setBackgroundColor(Color.parseColor("#ffffffff"));
  459. textView.setGravity(Gravity.CENTER);
  460. textView.setText(mTitle);
  461. return textView;
  462. }
  463. }
  464. 好了,到此我们的整个案例就结束了~~ 大家可以在布局文件中设置各种颜色,4个不同颜色也可以,尽情的玩耍吧~~
  465. 源码点击下载
  466. 我建了一个QQ群,方便大家交流。群号:55032675 ---------------------------------------------------------------------------------------------------------- 博主部分视频已经上线,如果你不喜欢枯燥的文本,请猛戳(初录,期待您的支持): 1Android 自定义控件实战 电商活动中的刮刮卡 2Android自定义控件实战 打造Android流式布局和热门标签
  467. 3Android智能机器人“小慕”的实现
  468. 4、高仿QQ5.0侧滑
  469. 5、高仿微信5.2.1主界面及消息提醒 Android ViewPager+RadioGroup+Fragment超高仿微信6.0底部滑动菜单,可通过左右滑动或点击底部RadioButton切换Fragment 下载源码地址:http://download.csdn.net/download/shenyuanqing/9428333 效果图:
  470. MainActivity.java
  471. [java] view plain copy print ?
  472. package com.example.administrator.wechat.activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.widget.RadioButton; import android.widget.RadioGroup; import com.example.administrator.wechat.R; import com.example.administrator.wechat.adapter.MyFragmentPagerAdapter; import com.example.administrator.wechat.fragment.ContactsFragment; import com.example.administrator.wechat.fragment.DiscoveryFragment; import com.example.administrator.wechat.fragment.MeFragment; import com.example.administrator.wechat.fragment.ChatFragment; import java.util.ArrayList; import java.util.List; public class MainActivity extends FragmentActivity { private ViewPager viewPager; private RadioGroup radioGroup; private RadioButton rbChat, rbContacts, rbDiscovery, rbMe; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { /** * RadioGroup部分 */ radioGroup = (RadioGroup) findViewById(R.id.radioGroup); rbChat = (RadioButton) findViewById(R.id.rb_chat); rbContacts = (RadioButton) findViewById(R.id.rb_contacts); rbDiscovery = (RadioButton) findViewById(R.id.rb_discovery); rbMe = (RadioButton) findViewById(R.id.rb_me); //RadioGroup选中状态改变监听 radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.rb_chat: /** * setCurrentItem第二个参数控制页面切换动画 * true:打开/false:关闭 */ viewPager.setCurrentItem(0, false); break; case R.id.rb_contacts: viewPager.setCurrentItem(1, false); break; case R.id.rb_discovery: viewPager.setCurrentItem(2, false); break; case R.id.rb_me: viewPager.setCurrentItem(3, false); break; } } }); /** * ViewPager部分 */ viewPager = (ViewPager) findViewById(R.id.viewPager); ChatFragment weChatFragment = new ChatFragment(); ContactsFragment contactsFragment = new ContactsFragment(); DiscoveryFragment discoveryFragment = new DiscoveryFragment(); MeFragment meFragment = new MeFragment(); List<Fragment> alFragment = new ArrayList<Fragment>(); alFragment.add(weChatFragment); alFragment.add(contactsFragment); alFragment.add(discoveryFragment); alFragment.add(meFragment); //ViewPager设置适配器 viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager(), alFragment)); //ViewPager显示第一个Fragment viewPager.setCurrentItem(0); //ViewPager页面切换监听 viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { switch (position) { case 0: radioGroup.check(R.id.rb_chat); break; case 1: radioGroup.check(R.id.rb_contacts); break; case 2: radioGroup.check(R.id.rb_discovery); break; case 3: radioGroup.check(R.id.rb_me); break; } } @Override public void onPageScrollStateChanged(int state) { } }); } }
  473. package com.example.administrator.wechat.activity;
  474. import android.os.Bundle;
  475. import android.support.v4.app.Fragment;
  476. import android.support.v4.app.FragmentActivity;
  477. import android.support.v4.view.ViewPager;
  478. import android.widget.RadioButton;
  479. import android.widget.RadioGroup;
  480. import com.example.administrator.wechat.R;
  481. import com.example.administrator.wechat.adapter.MyFragmentPagerAdapter;
  482. import com.example.administrator.wechat.fragment.ContactsFragment;
  483. import com.example.administrator.wechat.fragment.DiscoveryFragment;
  484. import com.example.administrator.wechat.fragment.MeFragment;
  485. import com.example.administrator.wechat.fragment.ChatFragment;
  486. import java.util.ArrayList;
  487. import java.util.List;
  488. public class MainActivity extends FragmentActivity {
  489. private ViewPager viewPager;
  490. private RadioGroup radioGroup;
  491. private RadioButton rbChat, rbContacts, rbDiscovery, rbMe;
  492. @Override
  493. protected void onCreate(Bundle savedInstanceState) {
  494. super.onCreate(savedInstanceState);
  495. setContentView(R.layout.activity_main);
  496. initView();
  497. }
  498. private void initView() {
  499. /**
  500. * RadioGroup部分
  501. */
  502. radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
  503. rbChat = (RadioButton) findViewById(R.id.rb_chat);
  504. rbContacts = (RadioButton) findViewById(R.id.rb_contacts);
  505. rbDiscovery = (RadioButton) findViewById(R.id.rb_discovery);
  506. rbMe = (RadioButton) findViewById(R.id.rb_me);
  507. //RadioGroup选中状态改变监听
  508. radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
  509. @Override
  510. public void onCheckedChanged(RadioGroup group, int checkedId) {
  511. switch (checkedId) {
  512. case R.id.rb_chat:
  513. /**
  514. * setCurrentItem第二个参数控制页面切换动画
  515. * true:打开/false:关闭
  516. */
  517. viewPager.setCurrentItem(0, false);
  518. break;
  519. case R.id.rb_contacts:
  520. viewPager.setCurrentItem(1, false);
  521. break;
  522. case R.id.rb_discovery:
  523. viewPager.setCurrentItem(2, false);
  524. break;
  525. case R.id.rb_me:
  526. viewPager.setCurrentItem(3, false);
  527. break;
  528. }
  529. }
  530. });
  531. /**
  532. * ViewPager部分
  533. */
  534. viewPager = (ViewPager) findViewById(R.id.viewPager);
  535. ChatFragment weChatFragment = new ChatFragment();
  536. ContactsFragment contactsFragment = new ContactsFragment();
  537. DiscoveryFragment discoveryFragment = new DiscoveryFragment();
  538. MeFragment meFragment = new MeFragment();
  539. List<Fragment> alFragment = new ArrayList<Fragment>();
  540. alFragment.add(weChatFragment);
  541. alFragment.add(contactsFragment);
  542. alFragment.add(discoveryFragment);
  543. alFragment.add(meFragment);
  544. //ViewPager设置适配器
  545. viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager(), alFragment));
  546. //ViewPager显示第一个Fragment
  547. viewPager.setCurrentItem(0);
  548. //ViewPager页面切换监听
  549. viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
  550. @Override
  551. public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  552. }
  553. @Override
  554. public void onPageSelected(int position) {
  555. switch (position) {
  556. case 0:
  557. radioGroup.check(R.id.rb_chat);
  558. break;
  559. case 1:
  560. radioGroup.check(R.id.rb_contacts);
  561. break;
  562. case 2:
  563. radioGroup.check(R.id.rb_discovery);
  564. break;
  565. case 3:
  566. radioGroup.check(R.id.rb_me);
  567. break;
  568. }
  569. }
  570. @Override
  571. public void onPageScrollStateChanged(int state) {
  572. }
  573. });
  574. }
  575. } activity_main.xml
  576. [html] view plain copy print ?
  577. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <RadioGroup android:id="@+id/radioGroup" android:layout_width="match_parent" android:layout_height="55dp" android:layout_alignParentBottom="true" android:background="@color/white" android:orientation="horizontal"> <RadioButton android:id="@+id/rb_chat" android:checked="true" android:text="@string/chat" android:drawableTop="@drawable/rb_chat_selector" style="@style/style_RadioButton"/> <RadioButton android:id="@+id/rb_contacts" android:text="@string/contacts" android:drawableTop="@drawable/rb_contacts_selector" style="@style/style_RadioButton"/> <RadioButton android:id="@+id/rb_discovery" android:text="@string/discovery" android:drawableTop="@drawable/rb_discovery_selector" style="@style/style_RadioButton"/> <RadioButton android:id="@+id/rb_me" android:text="@string/me" android:drawableTop="@drawable/rb_me_selector" style="@style/style_RadioButton"/> </RadioGroup> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/radioGroup" /> </RelativeLayout>
  578. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  579. android:layout_width="match_parent"
  580. android:layout_height="match_parent">
  581. <RadioGroup
  582. android:id="@+id/radioGroup"
  583. android:layout_width="match_parent"
  584. android:layout_height="55dp"
  585. android:layout_alignParentBottom="true"
  586. android:background="@color/white"
  587. android:orientation="horizontal">
  588. <RadioButton
  589. android:id="@+id/rb_chat"
  590. android:checked="true"
  591. android:text="@string/chat"
  592. android:drawableTop="@drawable/rb_chat_selector"
  593. style="@style/style_RadioButton"/>
  594. <RadioButton
  595. android:id="@+id/rb_contacts"
  596. android:text="@string/contacts"
  597. android:drawableTop="@drawable/rb_contacts_selector"
  598. style="@style/style_RadioButton"/>
  599. <RadioButton
  600. android:id="@+id/rb_discovery"
  601. android:text="@string/discovery"
  602. android:drawableTop="@drawable/rb_discovery_selector"
  603. style="@style/style_RadioButton"/>
  604. <RadioButton
  605. android:id="@+id/rb_me"
  606. android:text="@string/me"
  607. android:drawableTop="@drawable/rb_me_selector"
  608. style="@style/style_RadioButton"/>
  609. </RadioGroup>
  610. <android.support.v4.view.ViewPager
  611. android:id="@+id/viewPager"
  612. android:layout_width="match_parent"
  613. android:layout_height="match_parent"
  614. android:layout_above="@id/radioGroup" />
  615. </RelativeLayout> MyFragmentPagerAdapter
  616. [java] view plain copy print ?
  617. package com.example.administrator.wechat.adapter; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import java.util.List; /** * Created by Administrator on 2015/6/24. */ public class MyFragmentPagerAdapter extends FragmentPagerAdapter { private List<Fragment> list; public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> list) { super(fm); this.list = list; } @Override public Fragment getItem(int position) { return list.get(position); } @Override public int getCount() { return list.size(); } }
  618. package com.example.administrator.wechat.adapter;
  619. import android.support.v4.app.Fragment;
  620. import android.support.v4.app.FragmentManager;
  621. import android.support.v4.app.FragmentPagerAdapter;
  622. import java.util.List;
  623. /**
  624. * Created by Administrator on 2015/6/24.
  625. */
  626. public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
  627. private List<Fragment> list;
  628. public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> list) {
  629. super(fm);
  630. this.list = list;
  631. }
  632. @Override
  633. public Fragment getItem(int position) {
  634. return list.get(position);
  635. }
  636. @Override
  637. public int getCount() {
  638. return list.size();
  639. }
  640. } style.xml
  641. [html] view plain copy print ?
  642. <resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="android:colorPrimary">@color/green</item> </style> <style name="style_RadioButton"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:button">@null</item> <item name="android:background">@null</item> <item name="android:layout_weight">1</item> <item name="android:gravity">center</item> <item name="android:layout_gravity">center</item> <item name="android:textColor">@drawable/rb_focus_color</item> <item name="android:textSize">12sp</item> </style> </resources>

发表评论

表情:
评论列表 (有 0 条评论,261人围观)

还没有评论,来说两句吧...

相关阅读

    相关 选项切换

    一个选项卡,意思就是切换选项,一个最简单的列子,爱玩手机和电脑的肯定用过,选项卡和滚动条我觉得是差不多一个意思,当然只是差不多,并不绝对。 因为两者都是屏幕高度不够,而设计出

    相关 JS实现选项切换

    面是用JS简单地实现选项卡功能的实例。 > 注意点:(1)闭包后,要使用立即执行函数; > > (2)绑定事件注意参数; > > (3)思路:将当前div显示,其余隐藏,