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

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

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

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

 

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

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

  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.  * @author GV  
  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)这个方法是个关键点,即实现选中的效果。例如有 ABCD4 Item ,其中 C 被选中了,那么除 C 以外的 Item 都被设置为未被选中的样式,而 C 则设置为选中的样式。

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

  • SetNumColumns() :必须要使用 setNumColumns 来设置列数,因为这个 GridView 只有一行,即所有的 Item 都在同一行, Item 数量即为列数。
  • setSelector(new ColorDrawable(Color.TRANSPARENT)) :把系统默认选中的背景色透明化,因为我们已经在 BaseAdapter 中加入了 SetFocus() 来改变选中的样式。  
  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.  * @author GV  
  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.      * @param id GridView选中项的序号  
  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文件源码如下:

  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> 

你可能感兴趣的:(ActivityGroup)