且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

ActivityGroup 实现tabHost

更新时间:2022-09-03 23:16:16

引用:http://uuubd.iteye.com/blog/1487343

原文地址:http://blog.csdn.net/hellogv/article/details/6057174 

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

效果图: 

ActivityGroup 实现tabHost 


ImageAdapter是本实例的关键之一,它继承于BaseAdapter,并加入一些自定义的方法。ImageAdapter的源码如下: 
Java代码 
 ActivityGroup 实现tabHost
  1. package org.hwq.activitygroup.main;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Color;  
  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. public class ImageAdapter extends BaseAdapter {  
  12.     private Context context;  
  13.     private ImageView[] img;  
  14.       
  15.     ImageAdapter(Context context,int weight,int height,int[] img){  
  16.         this.context = context;  
  17.         this.img = new ImageView[img.length];  
  18.         for(int i=0;i<img.length;i++){  
  19.             this.img[i] = new ImageView(context);  
  20.             this.img[i].setLayoutParams(new GridView.LayoutParams(weight,height));  
  21.             this.img[i].setAdjustViewBounds(false);  
  22.             this.img[i].setPadding(2222);  
  23.             this.img[i].setImageResource(img[i]);  
  24.         }  
  25.     }  
  26.       
  27.     public void focus(int id){  
  28.         for(int i=0;i<img.length;i++){  
  29.             if(i == id){  
  30.                 img[i].setBackgroundColor(Color.YELLOW);  
  31.             }else{  
  32.                 img[i].setBackgroundColor(Color.TRANSPARENT);  
  33.             }  
  34.         }  
  35.     }  
  36.   
  37.     public int getCount() {  
  38.         return img.length;  
  39.     }  
  40.   
  41.     public Object getItem(int position) {  
  42.         return position;  
  43.     }  
  44.   
  45.     public long getItemId(int position) {  
  46.         return position;  
  47.     }  
  48.   
  49.     public View getView(int position, View convertView, ViewGroup parent) {  
  50.         ImageView imageview;  
  51.         if(convertView == null){  
  52.             imageview = img[position];  
  53.         }else{  
  54.             imageview = (ImageView) convertView;  
  55.         }  
  56.         return imageview;  
  57.     }  
  58.   
  59. }  

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

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

    SetNumColumns():必须要使用setNumColumns来设置列数,因为这个GridView只有一行,即所有的Item都在同一行,Item数量即为列数。 
    setSelector(new ColorDrawable(Color.TRANSPARENT)):把系统默认选中的背景色透明化,因为我们已经在BaseAdapter中加入了SetFocus()来改变选中的样式。 
ActivityGroupActivity.java 
Java代码 
 ActivityGroup 实现tabHost
  1. package org.hwq.activitygroup.main;  
  2.   
  3. import android.app.ActivityGroup;  
  4. import android.content.Intent;  
  5. import android.graphics.Color;  
  6. import android.graphics.drawable.ColorDrawable;  
  7. import android.os.Bundle;  
  8. import android.view.Gravity;  
  9. import android.view.View;  
  10. import android.view.ViewGroup.LayoutParams;  
  11. import android.view.Window;  
  12. import android.widget.AdapterView;  
  13. import android.widget.GridView;  
  14. import android.widget.LinearLayout;  
  15.   
  16. public class ActivityGroupActivity extends ActivityGroup {  
  17.     private GridView gridview;  
  18.     private LinearLayout layout;  
  19.     private int[] img;  
  20.     private ImageAdapter adapter;  
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.main);  
  25.         img = new int[]{R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img4};  
  26.         gridview = (GridView) findViewById(R.id.gridView1);  
  27.         layout = (LinearLayout) findViewById(R.id.linearlayout);  
  28.         gridview.setNumColumns(img.length);  
  29.         gridview.setSelector(new ColorDrawable(Color.TRANSPARENT));  
  30.         gridview.setGravity(Gravity.CENTER);  
  31.         gridview.setVerticalSpacing(0);  
  32.         int weight = getWindowManager().getDefaultDisplay().getWidth()/img.length;  
  33.         adapter = new ImageAdapter(this,weight,48,img);  
  34.         switchActivity(0);  
  35.         gridview.setAdapter(adapter);  
  36.         gridview.setOnItemClickListener(new GridviewItemListener());  
  37.     }  
  38.     class GridviewItemListener implements GridView.OnItemClickListener{  
  39.         public void onItemClick(AdapterView<?> parent, View view, int position,  
  40.                 long id) {  
  41.             switchActivity(position);  
  42.         }  
  43.     }  
  44.     public void switchActivity(int id){  
  45.         adapter.focus(id);  
  46.         layout.removeAllViews();  
  47.         Intent intent = null;  
  48.         if(id == 0){  
  49.             intent = new Intent(this,ActivityA.class);  
  50.         }else if(id == 1){  
  51.             intent = new Intent(this,ActivityB.class);  
  52.         }else if(id == 2){  
  53.             intent = new Intent(this,ActivityC.class);  
  54.         }else if(id == 3){  
  55.             intent = new Intent(this,ActivityD.class);  
  56.         }  
  57.         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
  58.         Window group = getLocalActivityManager().startActivity("", intent);  
  59.         layout.addView(group.getDecorView(),LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);  
  60.     }  
  61. }  


main.xml 
Java代码 
 ActivityGroup 实现tabHost
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <GridView  
  8.         android:id="@+id/gridView1"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:numColumns="3" >  
  12.     </GridView>  
  13.     <LinearLayout  
  14.         android:id="@+id/linearlayout"  
  15.         android:layout_width="fill_parent"  
  16.         android:layout_height="match_parent"  
  17.         >  
  18.     </LinearLayout>  
  19. </LinearLayout>  


demo源码: