zoukankan      html  css  js  c++  java
  • 转:ActivityGroup + GridView 实现Tab分页标签

    转自:http://blog.csdn.net/hellogv/article/details/6057174

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

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

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

    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>  
  • 相关阅读:
    LeetCode120 Triangle
    LeetCode119 Pascal's Triangle II
    LeetCode118 Pascal's Triangle
    LeetCode115 Distinct Subsequences
    LeetCode114 Flatten Binary Tree to Linked List
    LeetCode113 Path Sum II
    LeetCode112 Path Sum
    LeetCode111 Minimum Depth of Binary Tree
    Windows下搭建PHP开发环境-WEB服务器
    如何发布可用于azure的镜像文件
  • 原文地址:https://www.cnblogs.com/qingblog/p/2628251.html
Copyright © 2011-2022 走看看