Android之Tab分页标签的实现方法-----采用ActivityGroup和GridView的结合

来源:互联网 发布:js 正整数正则表达式 编辑:程序博客网 时间:2024/05/18 01:45
在前面,已经介绍了TabActivity和TabHost的结合实现Tab分页的三种方式。这里,将讲到采用ActivityGroup和GridView的结合,实现Tab分页。其实,这和TabActivity和TabHost的结合差不多。只不过,是自己把Tab的头部(选项栏)和页面视图分开实现。Tab头部采用GridView来实现,子页面采用LinearLayout容器来实现。然后把每个子Activity作为一个View视图,装载到LinearLayout容器里面。你会发现LinearLayout不仅仅是布局容器,它还有许多妙用。

        实现讲解:

        1、主类继承ActivityGroup

        public class GridViewTabPage extends ActivityGroup

        2、 获取每个子页面的Activity视图

        Intent intent = new Intent(GridViewTabPage.this, Page1.class);

        subPageView = getLocalActivityManager().startActivity(
      "subPageView" + i, intent);

        3、加载到容器

        pageContainer.addView(subPageView .getDecorView(),
        LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

 

         

                                                            

                                          

                                          

       1、布局XML文件:main.xml

       

view plain
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3. android:id="@+id/gridViewTab"  
  4. android:layout_width="fill_parent"  
  5. android:layout_height="fill_parent"  
  6. xmlns:android="http://schemas.android.com/apk/res/android"  
  7. android:orientation="vertical"  
  8. >  
  9. <GridView  
  10. android:id="@+id/gv_tabPage"  
  11. android:layout_width="fill_parent"  
  12. android:layout_height="wrap_content"  
  13. android:numColumns="3"  
  14. >  
  15. </GridView>  
  16. <LinearLayout  
  17. android:id="@+id/pageContainer"  
  18. android:layout_below="@+id/gvTopBar"   
  19. android:layout_width="fill_parent"        
  20. android:layout_height="fill_parent">  
  21. </LinearLayout>  
  22.   
  23. </LinearLayout>  

       2、代码文件:

        图片适配器:ImageAdapter.java

        

view plain
  1. package com.myandroid.test;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Color;  
  5. import android.util.Log;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8. import android.widget.BaseAdapter;  
  9. import android.widget.GridView;  
  10. import android.widget.ImageView;  
  11.   
  12. public class ImageAdapter extends BaseAdapter {  
  13.     private Context context;  
  14.     private int width;  
  15.     private int height;  
  16.     private ImageView[] imageViews;  
  17.     private Integer[] imgeIDs;  
  18.       
  19.     public ImageAdapter(Context context, Integer[] imageIDs, int width, int height) {  
  20.         this.context = context;  
  21.         this.imgeIDs = imageIDs;  
  22.         this.width = width;  
  23.         this.height = height;  
  24.         imageViews = new ImageView[imageIDs.length];  
  25.         for(int i = 0; i < imageViews.length; i++) {  
  26.             imageViews[i] = new ImageView(context);  
  27.         }  
  28.     }  
  29.   
  30.     public int getCount() {  
  31.         // TODO Auto-generated method stub  
  32.         return imgeIDs.length;  
  33.     }  
  34.   
  35.     public Object getItem(int position) {  
  36.         // TODO Auto-generated method stub  
  37.         return position;  
  38.     }  
  39.   
  40.     public long getItemId(int position) {  
  41.         // TODO Auto-generated method stub  
  42.         return position;  
  43.     }  
  44.       
  45.     /** 
  46.      * 点击设置 
  47.      * @param selectedID 
  48.      */  
  49.     public void setFocus(int selectedID) {  
  50.         Log.e("Seqence""setFocus");  
  51.         for(int i = 0; i < imageViews.length; i++) {  
  52.             imageViews[i].setBackgroundColor(Color.BLACK);  
  53.         }  
  54.         imageViews[selectedID].setBackgroundColor(Color.YELLOW);  
  55.     }  
  56.       
  57.     /** 
  58.      * 图片设置 
  59.      */  
  60.     public View getView(int position, View convertView, ViewGroup parent) {  
  61.         // TODO Auto-generated method stub  
  62.         Log.e("Seqence""getView");  
  63.         imageViews[position].setImageResource(imgeIDs[position]);  
  64.         imageViews[position].setLayoutParams(new GridView.LayoutParams(width, height));  
  65.         imageViews[position].setBackgroundColor(android.R.drawable.picture_frame);  
  66.           
  67.         return imageViews[position];  
  68.     }  
  69.   
  70. }  

         主文件:GridViewTabPage.java

        

view plain
  1. package com.myandroid.test;  
  2.   
  3.   
  4. import android.app.ActivityGroup;  
  5. import android.content.Intent;  
  6. import android.graphics.Color;  
  7. import android.graphics.drawable.ColorDrawable;  
  8. import android.os.Bundle;  
  9. import android.util.Log;  
  10. import android.view.Gravity;  
  11. import android.view.View;  
  12. import android.view.Window;  
  13. import android.view.ViewGroup.LayoutParams;  
  14. import android.widget.AdapterView;  
  15. import android.widget.GridView;  
  16. import android.widget.LinearLayout;  
  17. import android.widget.AdapterView.OnItemClickListener;  
  18.   
  19. public class GridViewTabPage extends ActivityGroup {  
  20.   
  21.     private GridView gv_tabPage;            //顶部Tab标签  
  22.     private ImageAdapter imageAdapter;      //图片适配器  
  23.     public LinearLayout pageContainer;      // 放置子页面的容器  
  24.     private Intent[] intents;               //页面跳转Intent  
  25.     private Window[] subPageView;           //子页面视图View  
  26.     private Integer[] tabImages = { R.drawable.a1,  //tab标签图标  
  27.             R.drawable.a2, R.drawable.a3,};  
  28.   
  29.     @Override  
  30.     public void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.main);  
  33.         Log.e("Sequence""start"); //测试用  
  34.         gv_tabPage = (GridView) findViewById(R.id.gv_tabPage);  
  35.         gv_tabPage.setNumColumns(tabImages.length);// 设置列数  
  36.         gv_tabPage.setSelector(new ColorDrawable(Color.TRANSPARENT));// 选中的时候为透明色  
  37.         gv_tabPage.setGravity(Gravity.CENTER);// 位置居中  
  38.         gv_tabPage.setVerticalSpacing(0);// 垂直间隔  
  39.         int width = this.getWindowManager().getDefaultDisplay().getWidth()//获取屏幕宽度  
  40.                 / tabImages.length;//平分宽度  
  41.         imageAdapter = new ImageAdapter(this, tabImages, width, 48);    //创建图片适配器,传递图片所需高和宽  
  42.         gv_tabPage.setAdapter(imageAdapter);// 设置菜单Adapter  
  43.         gv_tabPage.setOnItemClickListener(new ItemClickEvent()); //注册点击事件  
  44.         pageContainer = (LinearLayout) findViewById(R.id.pageContainer);  
  45.         SwitchPage(0);//默认打开第0页  
  46.         Log.e("Sequence""end");  
  47.     }  
  48.   
  49.     class ItemClickEvent implements OnItemClickListener {  
  50.   
  51.         public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
  52.                 long arg3) {  
  53.             SwitchPage(arg2); //arg2表示选中的Tab标签号,从0~2  
  54.         }  
  55.     }  
  56.       
  57.     /** 
  58.      * 用于获取intent和pageView, 
  59.      * 类似于单例模式,使得对象不用重复创建,同时,保留上一个对象的状态 
  60.      * 当重新访问时,仍保留原来数据状态,如文本框里面的值。 
  61.      * @param pageID 选中的tab序号(0~2) 
  62.      * @return 
  63.      */  
  64.     private Window getPageView(int pageID) {  
  65.         if(intents == null) {  
  66.             intents = new Intent[3];  
  67.             subPageView = new Window[3];  
  68.             intents[0] = new Intent(GridViewTabPage.this, Page1.class);  
  69.             intents[1] = new Intent(GridViewTabPage.this, Page2.class);  
  70.             intents[2] = new Intent(GridViewTabPage.this, Page3.class);  
  71.             for(int i = 0; i < 3; i++) {  
  72.                 subPageView[i] = getLocalActivityManager().startActivity(  
  73.                         "subPageView" + i, intents[i]);  
  74.             }  
  75.             Log.e("New""new");              
  76.         }  
  77.   
  78.         return subPageView[pageID];  
  79.     }  
  80.       
  81.     /** 
  82.      * 根据ID打开指定的PageActivity 
  83.      * @param id 选中项的tab序号 
  84.      */  
  85.     private void SwitchPage(int id)  
  86.     {  
  87.         pageContainer.removeAllViews();//必须先清除容器中所有的View  
  88.         imageAdapter.setFocus(id);  
  89.         Window pageView = null;  
  90.         switch(id){ //获取子页面View  
  91.         case 0:  
  92.             pageView = getPageView(0);  
  93.             break;  
  94.         case 1:  
  95.             pageView = getPageView(1);  
  96.             break;  
  97.         case 2:  
  98.             pageView = getPageView(2);  
  99.             break;  
  100.         default:  
  101.             break;  
  102.         }   
  103.         //装载子页面View到LinearLayout容器里面  
  104.         pageContainer.addView(pageView.getDecorView(),  
  105.                 LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);  
  106.     }  
  107. }  

         3、最后是在AndroidManifest.xml里添加Activity注册信息

        

view plain
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="com.myandroid.test"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  7.  ................  
  8.      <!-- 要添加Activity的声明,否则系统找不到文件报错 -->  
  9.         <activity android:name="Page1"></activity>  
  10.         <activity android:name="Page2"></activity>  
  11.         <activity android:name="Page3"></activity>  
  12.     </application>  
  13. </manifest>   

          同样的,对于Tab选项过多,可以采用Grally+ActivityGroup结合的实现方式。具体实现方法,和ActivityGroup和GridView的结合差不多,读者可以自己实现。

原创粉丝点击