zoukankan      html  css  js  c++  java
  • Android入门第十五篇之ActivityGroup + GridView 实现Tab分页标签(转载)

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

          很多客户端软件和浏览器软件都喜欢用Tab分页标签来搭建界面框架。读者也许会马上想到使用TabHost  TabActivity的组合,其实最常用的不是它们,而是由GridViewActivityGroup的组合。每当用户在GridView选中一项,ActivityGroup就把该项对应的ActivityWindow作为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(2222);   
    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)这个方法是个关键点,即实现选中的效果。例如有ABCD4Item,其中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>  
  • 相关阅读:
    BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告
    codeforces 31C Schedule 解题报告
    codeforces 462C Appleman and Toastman 解题报告
    codeforces 460C. Present 解题报告
    BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告
    BestCoder3 1001 Task schedule(hdu 4907) 解题报告
    poj 1195 Mobile phones 解题报告
    二维树状数组 探索进行中
    codeforces 460B Little Dima and Equation 解题报告
    通过Sql语句控制SQLite数据库增删改查
  • 原文地址:https://www.cnblogs.com/merryjd/p/2852912.html
Copyright © 2011-2022 走看看