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)中。
先来贴出本例运行的效果图如下:
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); } }
上一篇: 妹纸这一脚夸张了