Android入門之ActivityGroup+GridView實現Tab分頁標籤的方法_Android

來源:互聯網
上載者:User

在Android程式中很多用戶端軟體和瀏覽器軟體都喜歡用Tab分頁標籤來搭建介面架構。讀者也許會馬上想到使用TabHost 與 TabActivity的組合,其實最常用的不是它們,而是由GridView與ActivityGroup的組合。每當使用者在GridView選中一項,ActivityGroup就把該項對應的Activity的Window作為View添加到ActivityGroup所指定的容器(LinearLayout)中。

先來貼出本例啟動並執行效果圖如下:

ImageAdapter是本執行個體的關鍵之一,它繼承於BaseAdapter,並加入一些自訂的方法。ImageAdapter的源碼如下:

package com.ActivityGroupDemo;import android.content.Context;import android.graphics.drawable.ColorDrawable;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.ImageView;/** *  * @author GV * */public class ImageAdapter extends BaseAdapter { private Context mContext;  private ImageView[] imgItems; private int selResId;  public ImageAdapter(Context c,int[] picIds,int width,int height,int selResId) {     mContext = c;     this.selResId=selResId;    imgItems=new ImageView[picIds.length];    for(int i=0;i<picIds.length;i++)    {     imgItems[i] = new ImageView(mContext);      imgItems[i].setLayoutParams(new GridView.LayoutParams(width, height));//設定ImageView寬高      imgItems[i].setAdjustViewBounds(false);      //imgItems[i].setScaleType(ImageView.ScaleType.CENTER_CROP);      imgItems[i].setPadding(2, 2, 2, 2);      imgItems[i].setImageResource(picIds[i]);     }  }   public int getCount() {     return imgItems.length;   }    public Object getItem(int position) {     return position;   }    public long getItemId(int position) {     return position;   }    /**    * 設定選中的效果    */   public void SetFocus(int index)   {     for(int i=0;i<imgItems.length;i++)     {       if(i!=index)       {        imgItems[i].setBackgroundResource(0);//恢複未選中的樣式      }     }     imgItems[index].setBackgroundResource(selResId);//設定選中的樣式  }     public View getView(int position, View convertView, ViewGroup parent) {     ImageView imageView;     if (convertView == null) {      imageView=imgItems[position];    } else {       imageView = (ImageView) convertView;     }     return imageView;   } } 

其中SetFocus(int)這個方法是個關鍵點,即實現選中的效果。例如有ABCD4個Item,其中C被選中了,那麼除C以外的Item都被設定為未被選中的樣式,而C則設定為選中的樣式。

接下來就開始寫主Activity,主Activity包含GridView控制項,名為gvTopBar,有2點是需要注意一下的。

1.SetNumColumns():必須要使用setNumColumns來設定列數,因為這個GridView只有一行,即所有的Item都在同一行,Item數量即為列數。

2.setSelector(new ColorDrawable(Color.TRANSPARENT)):把系統預設選中的背景色透明化,因為我們已經在BaseAdapter中加入了SetFocus()來改變選中的樣式。

package com.ActivityGroupDemo;import android.app.Activity;import android.app.ActivityGroup;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.graphics.Color;import android.graphics.drawable.ColorDrawable;import android.os.Bundle;import android.util.Log;import android.view.Gravity;import android.view.View;import android.view.Window;import android.view.ViewGroup.LayoutParams;import android.widget.AdapterView;import android.widget.GridView;import android.widget.LinearLayout;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;/** *  * @author GV * */public class ActivityGroupDemo extends ActivityGroup { private GridView gvTopBar; private ImageAdapter topImgAdapter; public LinearLayout container;// 裝載sub Activity的容器 /** 頂部按鈕圖片 **/ int[] topbar_image_array = { R.drawable.topbar_home,  R.drawable.topbar_user, R.drawable.topbar_shoppingcart,  R.drawable.topbar_note }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); gvTopBar = (GridView) this.findViewById(R.id.gvTopBar); gvTopBar.setNumColumns(topbar_image_array.length);// 設定每行列數 gvTopBar.setSelector(new ColorDrawable(Color.TRANSPARENT));// 選中的時候為透明色 gvTopBar.setGravity(Gravity.CENTER);// 位置置中 gvTopBar.setVerticalSpacing(0);// 垂直間隔 int width = this.getWindowManager().getDefaultDisplay().getWidth()  / topbar_image_array.length; topImgAdapter = new ImageAdapter(this, topbar_image_array, width, 48,  R.drawable.topbar_itemselector); gvTopBar.setAdapter(topImgAdapter);// 設定菜單Adapter gvTopBar.setOnItemClickListener(new ItemClickEvent());// 項目點擊事件 container = (LinearLayout) findViewById(R.id.Container); SwitchActivity(0);//預設開啟第0頁 } class ItemClickEvent implements OnItemClickListener { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  long arg3) {  SwitchActivity(arg2); } } /** * 根據ID開啟指定的Activity * @param id GridView選中項的序號 */ void SwitchActivity(int id) { topImgAdapter.SetFocus(id);//選中項獲得高亮 container.removeAllViews();//必須先清除容器中所有的View Intent intent =null; if (id == 0 || id == 2) {  intent = new Intent(ActivityGroupDemo.this, ActivityA.class); } else if (id == 1 || id == 3) {  intent = new Intent(ActivityGroupDemo.this, ActivityB.class); }  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //Activity 轉為 View Window subActivity = getLocalActivityManager().startActivity(  "subActivity", intent); //容器添加View container.addView(subActivity.getDecorView(),  LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.