`

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

 
阅读更多

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

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

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

  1. packagecom.ActivityGroupDemo;
  2. importandroid.content.Context;
  3. importandroid.graphics.drawable.ColorDrawable;
  4. importandroid.view.View;
  5. importandroid.view.ViewGroup;
  6. importandroid.widget.BaseAdapter;
  7. importandroid.widget.GridView;
  8. importandroid.widget.ImageView;
  9. /**
  10. *
  11. *@authorGV
  12. *
  13. */
  14. publicclassImageAdapterextendsBaseAdapter{
  15. privateContextmContext;
  16. privateImageView[]imgItems;
  17. privateintselResId;
  18. publicImageAdapter(Contextc,int[]picIds,intwidth,intheight,intselResId){
  19. mContext=c;
  20. this.selResId=selResId;
  21. imgItems=newImageView[picIds.length];
  22. for(inti=0;i<picIds.length;i++)
  23. {
  24. imgItems[i]=newImageView(mContext);
  25. imgItems[i].setLayoutParams(newGridView.LayoutParams(width,height));//设置ImageView宽高
  26. imgItems[i].setAdjustViewBounds(false);
  27. //imgItems[i].setScaleType(ImageView.ScaleType.CENTER_CROP);
  28. imgItems[i].setPadding(2,2,2,2);
  29. imgItems[i].setImageResource(picIds[i]);
  30. }
  31. }
  32. publicintgetCount(){
  33. returnimgItems.length;
  34. }
  35. publicObjectgetItem(intposition){
  36. returnposition;
  37. }
  38. publiclonggetItemId(intposition){
  39. returnposition;
  40. }
  41. /**
  42. *设置选中的效果
  43. */
  44. publicvoidSetFocus(intindex)
  45. {
  46. for(inti=0;i<imgItems.length;i++)
  47. {
  48. if(i!=index)
  49. {
  50. imgItems[i].setBackgroundResource(0);//恢复未选中的样式
  51. }
  52. }
  53. imgItems[index].setBackgroundResource(selResId);//设置选中的样式
  54. }
  55. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  56. ImageViewimageView;
  57. if(convertView==null){
  58. imageView=imgItems[position];
  59. }else{
  60. imageView=(ImageView)convertView;
  61. }
  62. returnimageView;
  63. }
  64. }

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

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

  • SetNumColumns():必须要使用setNumColumns来设置列数,因为这个GridView只有一行,即所有的Item都在同一行,Item数量即为列数。
  • setSelector(new ColorDrawable(Color.TRANSPARENT)):把系统默认选中的背景色透明化,因为我们已经在BaseAdapter中加入了SetFocus()来改变选中的样式。

  1. packagecom.ActivityGroupDemo;
  2. importandroid.app.Activity;
  3. importandroid.app.ActivityGroup;
  4. importandroid.content.BroadcastReceiver;
  5. importandroid.content.Context;
  6. importandroid.content.Intent;
  7. importandroid.content.IntentFilter;
  8. importandroid.graphics.Color;
  9. importandroid.graphics.drawable.ColorDrawable;
  10. importandroid.os.Bundle;
  11. importandroid.util.Log;
  12. importandroid.view.Gravity;
  13. importandroid.view.View;
  14. importandroid.view.Window;
  15. importandroid.view.ViewGroup.LayoutParams;
  16. importandroid.widget.AdapterView;
  17. importandroid.widget.GridView;
  18. importandroid.widget.LinearLayout;
  19. importandroid.widget.Toast;
  20. importandroid.widget.AdapterView.OnItemClickListener;
  21. /**
  22. *
  23. *@authorGV
  24. *
  25. */
  26. publicclassActivityGroupDemoextendsActivityGroup{
  27. privateGridViewgvTopBar;
  28. privateImageAdaptertopImgAdapter;
  29. publicLinearLayoutcontainer;//装载subActivity的容器
  30. /**顶部按钮图片**/
  31. int[]topbar_image_array={R.drawable.topbar_home,
  32. R.drawable.topbar_user,R.drawable.topbar_shoppingcart,
  33. R.drawable.topbar_note};
  34. @Override
  35. publicvoidonCreate(BundlesavedInstanceState){
  36. super.onCreate(savedInstanceState);
  37. setContentView(R.layout.main);
  38. gvTopBar=(GridView)this.findViewById(R.id.gvTopBar);
  39. gvTopBar.setNumColumns(topbar_image_array.length);//设置每行列数
  40. gvTopBar.setSelector(newColorDrawable(Color.TRANSPARENT));//选中的时候为透明色
  41. gvTopBar.setGravity(Gravity.CENTER);//位置居中
  42. gvTopBar.setVerticalSpacing(0);//垂直间隔
  43. intwidth=this.getWindowManager().getDefaultDisplay().getWidth()
  44. /topbar_image_array.length;
  45. topImgAdapter=newImageAdapter(this,topbar_image_array,width,48,
  46. R.drawable.topbar_itemselector);
  47. gvTopBar.setAdapter(topImgAdapter);//设置菜单Adapter
  48. gvTopBar.setOnItemClickListener(newItemClickEvent());//项目点击事件
  49. container=(LinearLayout)findViewById(R.id.Container);
  50. SwitchActivity(0);//默认打开第0页
  51. }
  52. classItemClickEventimplementsOnItemClickListener{
  53. publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,
  54. longarg3){
  55. SwitchActivity(arg2);
  56. }
  57. }
  58. /**
  59. *根据ID打开指定的Activity
  60. *@paramidGridView选中项的序号
  61. */
  62. voidSwitchActivity(intid)
  63. {
  64. topImgAdapter.SetFocus(id);//选中项获得高亮
  65. container.removeAllViews();//必须先清除容器中所有的View
  66. Intentintent=null;
  67. if(id==0||id==2){
  68. intent=newIntent(ActivityGroupDemo.this,ActivityA.class);
  69. }elseif(id==1||id==3){
  70. intent=newIntent(ActivityGroupDemo.this,ActivityB.class);
  71. }
  72. intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  73. //Activity转为View
  74. WindowsubActivity=getLocalActivityManager().startActivity(
  75. "subActivity",intent);
  76. //容器添加View
  77. container.addView(subActivity.getDecorView(),
  78. LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
  79. }
  80. }

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

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <RelativeLayoutandroid:layout_height="fill_parent"
  6. android:layout_width="fill_parent">
  7. <GridViewandroid: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. <LinearLayoutandroid: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>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics