欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android入门之ActivityGroup+GridView实现Tab分页标签的方法

程序员文章站 2022-11-05 16:12:49
在android程序中很多客户端软件和浏览器软件都喜欢用tab分页标签来搭建界面框架。读者也许会马上想到使用tabhost 与 tabactivity的组合,其实最常用的不...

在android程序中很多客户端软件和浏览器软件都喜欢用tab分页标签来搭建界面框架。读者也许会马上想到使用tabhost 与 tabactivity的组合,其实最常用的不是它们,而是由gridview与activitygroup的组合。每当用户在gridview选中一项,activitygroup就把该项对应的activity的window作为view添加到activitygroup所指定的容器(linearlayout)中。

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

Android入门之ActivityGroup+GridView实现Tab分页标签的方法

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);
 }
}