当前位置: 代码迷 >> Android >> Android进门第十五篇之ActivityGroup + GridView 实现Tab分页标签
  详细解决方案

Android进门第十五篇之ActivityGroup + GridView 实现Tab分页标签

热度:50   发布时间:2016-05-01 19:01:20.0
Android入门第十五篇之ActivityGroup + GridView 实现Tab分页标签

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!

????? 很多客户端软件和浏览器软件都喜欢用Tab分页标签来搭建界面框架。读者也许会马上想到使用TabHost TabActivity的组合,其实最常用的不是它们,而是由GridViewActivityGroup的组合。每当用户在GridView选中一项,ActivityGroup就把该项对应的ActivityWindow作为View添加到ActivityGroup所指定的容器(LinearLayout)中。

接下来贴出本例运行的效果图

?

ImageAdapter是本实例的关键之一,它继承于BaseAdapter,并加入一些自定义的方法。ImageAdapter的源码如下:

view plainprint?
  1. package?com.ActivityGroupDemo;??
  2. ??
  3. import?android.content.Context;??
  4. import?android.graphics.drawable.ColorDrawable;??
  5. import?android.view.View;??
  6. import?android.view.ViewGroup;??
  7. import?android.widget.BaseAdapter;??
  8. import?android.widget.GridView;??
  9. import?android.widget.ImageView;??
  10. /**?
  11. ?*??
  12. [email protected]?
  13. ?*?
  14. ?*/??
  15. public?class?ImageAdapter?extends?BaseAdapter?{??
  16. ????private?Context?mContext;???
  17. ????private?ImageView[]?imgItems;??
  18. ????private?int?selResId;??
  19. ????public?ImageAdapter(Context?c,int[]?picIds,int?width,int?height,int?selResId)?{???
  20. ????????mContext?=?c;???
  21. ????????this.selResId=selResId;??
  22. ????????imgItems=new?ImageView[picIds.length];??
  23. ????????for(int?i=0;i<picIds.length;i++)??
  24. ????????{??
  25. ????????????imgItems[i]?=?new?ImageView(mContext);???
  26. ????????????imgItems[i].setLayoutParams(new?GridView.LayoutParams(width,?height));//设置ImageView宽高???
  27. ????????????imgItems[i].setAdjustViewBounds(false);???
  28. ????????????//imgItems[i].setScaleType(ImageView.ScaleType.CENTER_CROP);???
  29. ????????????imgItems[i].setPadding(2,?2,?2,?2);???
  30. ????????????imgItems[i].setImageResource(picIds[i]);???
  31. ????????}??
  32. ????}???
  33. ???
  34. ????public?int?getCount()?{???
  35. ????????return?imgItems.length;???
  36. ????}???
  37. ???
  38. ????public?Object?getItem(int?position)?{???
  39. ????????return?position;???
  40. ????}???
  41. ???
  42. ????public?long?getItemId(int?position)?{???
  43. ????????return?position;???
  44. ????}???
  45. ???
  46. ????/**??
  47. ?????*?设置选中的效果??
  48. ?????*/????
  49. ????public?void?SetFocus(int?index)????
  50. ????{????
  51. ????????for(int?i=0;i<imgItems.length;i++)????
  52. ????????{????
  53. ????????????if(i!=index)????
  54. ????????????{????
  55. ????????????????imgItems[i].setBackgroundResource(0);//恢复未选中的样式??
  56. ????????????}????
  57. ????????}????
  58. ????????imgItems[index].setBackgroundResource(selResId);//设置选中的样式??
  59. ????}????
  60. ??????
  61. ????public?View?getView(int?position,?View?convertView,?ViewGroup?parent)?{???
  62. ????????ImageView?imageView;???
  63. ????????if?(convertView?==?null)?{???
  64. ????????????imageView=imgItems[position];??
  65. ????????}?else?{???
  66. ????????????imageView?=?(ImageView)?convertView;???
  67. ????????}???
  68. ????????return?imageView;???
  69. ????}???
  70. }???

?SetFocus(int)这个方法是个关键点,即实现选中的效果。例如有ABCD4Item,其中C被选中了,那么除C以外的Item都被设置为未被选中的样式,而C则设置为选中的样式。

接下来就开始写主Activity,主Activity包含GridView控件,名为gvTopBar,有2点是需要注意一下的。

  • SetNumColumns():必须要使用setNumColumns来设置列数,因为这个GridView只有一行,即所有的Item都在同一行,Item数量即为列数。
  • setSelector(new ColorDrawable(Color.TRANSPARENT)):把系统默认选中的背景色透明化,因为我们已经在BaseAdapter中加入了SetFocus()来改变选中的样式。?
view plainprint?
  1. package?com.ActivityGroupDemo;??
  2. ??
  3. import?android.app.Activity;??
  4. import?android.app.ActivityGroup;??
  5. import?android.content.BroadcastReceiver;??
  6. import?android.content.Context;??
  7. import?android.content.Intent;??
  8. import?android.content.IntentFilter;??
  9. import?android.graphics.Color;??
  10. import?android.graphics.drawable.ColorDrawable;??
  11. import?android.os.Bundle;??
  12. import?android.util.Log;??
  13. import?android.view.Gravity;??
  14. import?android.view.View;??
  15. import?android.view.Window;??
  16. import?android.view.ViewGroup.LayoutParams;??
  17. import?android.widget.AdapterView;??
  18. import?android.widget.GridView;??
  19. import?android.widget.LinearLayout;??
  20. import?android.widget.Toast;??
  21. import?android.widget.AdapterView.OnItemClickListener;??
  22. /**?
  23. ?*??
  24. [email protected]?
  25. ?*?
  26. ?*/??
  27. public?class?ActivityGroupDemo?extends?ActivityGroup?{??
  28. ??
  29. ????private?GridView?gvTopBar;??
  30. ????private?ImageAdapter?topImgAdapter;??
  31. ????public?LinearLayout?container;//?装载sub?Activity的容器??
  32. ??
  33. ????/**?顶部按钮图片?**/??
  34. ????int[]?topbar_image_array?=?{?R.drawable.topbar_home,??
  35. ????????????R.drawable.topbar_user,?R.drawable.topbar_shoppingcart,??
  36. ????????????R.drawable.topbar_note?};??
  37. ??
  38. ????@Override??
  39. ????public?void?onCreate(Bundle?savedInstanceState)?{??
  40. ????????super.onCreate(savedInstanceState);??
  41. ????????setContentView(R.layout.main);??
  42. ????????gvTopBar?=?(GridView)?this.findViewById(R.id.gvTopBar);??
  43. ????????gvTopBar.setNumColumns(topbar_image_array.length);//?设置每行列数??
  44. ????????gvTopBar.setSelector(new?ColorDrawable(Color.TRANSPARENT));//?选中的时候为透明色??
  45. ????????gvTopBar.setGravity(Gravity.CENTER);//?位置居中??
  46. ????????gvTopBar.setVerticalSpacing(0);//?垂直间隔??
  47. ????????int?width?=?this.getWindowManager().getDefaultDisplay().getWidth()??
  48. ????????????????/?topbar_image_array.length;??
  49. ????????topImgAdapter?=?new?ImageAdapter(this,?topbar_image_array,?width,?48,??
  50. ????????????????R.drawable.topbar_itemselector);??
  51. ????????gvTopBar.setAdapter(topImgAdapter);//?设置菜单Adapter??
  52. ????????gvTopBar.setOnItemClickListener(new?ItemClickEvent());//?项目点击事件??
  53. ????????container?=?(LinearLayout)?findViewById(R.id.Container);??
  54. ????????SwitchActivity(0);//默认打开第0页??
  55. ????}??
  56. ??
  57. ????class?ItemClickEvent?implements?OnItemClickListener?{??
  58. ??
  59. ????????public?void?onItemClick(AdapterView<?>?arg0,?View?arg1,?int?arg2,??
  60. ????????????????long?arg3)?{??
  61. ????????????SwitchActivity(arg2);??
  62. ????????}??
  63. ????}??
  64. ????/**?
  65. ?????*?根据ID打开指定的Activity?
  66. [email protected]?
  67. ?????*/??
  68. ????void?SwitchActivity(int?id)??
  69. ????{??
  70. ????????topImgAdapter.SetFocus(id);//选中项获得高亮??
  71. ????????container.removeAllViews();//必须先清除容器中所有的View??
  72. ????????Intent?intent?=null;??
  73. ????????if?(id?==?0?||?id?==?2)?{??
  74. ????????????intent?=?new?Intent(ActivityGroupDemo.this,?ActivityA.class);??
  75. ????????}?else?if?(id?==?1?||?id?==?3)?{??
  76. ????????????intent?=?new?Intent(ActivityGroupDemo.this,?ActivityB.class);??
  77. ????????}???
  78. ????????intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);??
  79. ????????//Activity?转为?View??
  80. ????????Window?subActivity?=?getLocalActivityManager().startActivity(??
  81. ????????????????"subActivity",?intent);??
  82. ????????//容器添加View??
  83. ????????container.addView(subActivity.getDecorView(),??
  84. ????????????????LayoutParams.FILL_PARENT,?LayoutParams.FILL_PARENT);??
  85. ????}??
  86. ??
  87. }??

主Activity的布局XML文件源码如下:

view plainprint?
  1. <?xml?version="1.0"?encoding="utf-8"?>??
  2. <LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??
  3. ????android:orientation="vertical"?android:layout_width="fill_parent"??
  4. ????android:layout_height="fill_parent">??
  5. ????<RelativeLayout?android:layout_height="fill_parent"??
  6. ????????android:layout_width="fill_parent">??
  7. ????????<GridView?android:layout_height="wrap_content"?android:id="@+id/gvTopBar"??
  8. ????????????android:layout_alignParentTop="true"?android:layout_width="fill_parent"??
  9. ????????????android:fadingEdgeLength="5dip"?android:fadingEdge="vertical">??
  10. ????????</GridView>??
  11. ????????<LinearLayout?android:id="@+id/Container"??
  12. ????????????android:layout_below="@+id/gvTopBar"?android:layout_width="fill_parent"??
  13. ????????????android:layout_height="fill_parent">??
  14. ????????</LinearLayout>??
  15. ????</RelativeLayout>??
  16. </LinearLayout>?

  相关解决方案