转载:ActivityGroup 实现TabHost

本文介绍了一种使用GridView与ActivityGroup组合实现Tab分页效果的方法。通过ImageAdapter自定义BaseAdapter来展示图标,并根据不同选择切换Activity显示。每个Activity代表一个Tab页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载:ActivityGroup 实现TabHost

原文地址:[url]http://blog.youkuaiyun.com/hellogv/article/details/6057174[/url]


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

效果图:

[img]http://dl.iteye.com/upload/attachment/0066/6395/c56cc54f-346d-3e73-b0e5-cf25f7051a94.jpg[/img]


ImageAdapter是本实例的关键之一,它继承于BaseAdapter,并加入一些自定义的方法。ImageAdapter的源码如下:
package org.hwq.activitygroup.main;

import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {
private Context context;
private ImageView[] img;

ImageAdapter(Context context,int weight,int height,int[] img){
this.context = context;
this.img = new ImageView[img.length];
for(int i=0;i<img.length;i++){
this.img[i] = new ImageView(context);
this.img[i].setLayoutParams(new GridView.LayoutParams(weight,height));
this.img[i].setAdjustViewBounds(false);
this.img[i].setPadding(2, 2, 2, 2);
this.img[i].setImageResource(img[i]);
}
}

public void focus(int id){
for(int i=0;i<img.length;i++){
if(i == id){
img[i].setBackgroundColor(Color.YELLOW);
}else{
img[i].setBackgroundColor(Color.TRANSPARENT);
}
}
}

public int getCount() {
return img.length;
}

public Object getItem(int position) {
return position;
}

public long getItemId(int position) {
return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageview;
if(convertView == null){
imageview = img[position];
}else{
imageview = (ImageView) convertView;
}
return imageview;
}

}

SetFocus(int)这个方法是个关键点,即实现选中的效果。例如有ABCD4个Item,其中C被选中了,那么除C以外的Item都被设置为未被选中的样式,而C则设置为选中的样式。

接下来就开始写主Activity,主Activity包含GridView控件,有2点是需要注意一下的。

SetNumColumns():必须要使用setNumColumns来设置列数,因为这个GridView只有一行,即所有的Item都在同一行,Item数量即为列数。
setSelector(new ColorDrawable(Color.TRANSPARENT)):把系统默认选中的背景色透明化,因为我们已经在BaseAdapter中加入了SetFocus()来改变选中的样式。
ActivityGroupActivity.java
package org.hwq.activitygroup.main;

import android.app.ActivityGroup;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.LinearLayout;

public class ActivityGroupActivity extends ActivityGroup {
private GridView gridview;
private LinearLayout layout;
private int[] img;
private ImageAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
img = new int[]{R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img4};
gridview = (GridView) findViewById(R.id.gridView1);
layout = (LinearLayout) findViewById(R.id.linearlayout);
gridview.setNumColumns(img.length);
gridview.setSelector(new ColorDrawable(Color.TRANSPARENT));
gridview.setGravity(Gravity.CENTER);
gridview.setVerticalSpacing(0);
int weight = getWindowManager().getDefaultDisplay().getWidth()/img.length;
adapter = new ImageAdapter(this,weight,48,img);
switchActivity(0);
gridview.setAdapter(adapter);
gridview.setOnItemClickListener(new GridviewItemListener());
}
class GridviewItemListener implements GridView.OnItemClickListener{
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
switchActivity(position);
}
}
public void switchActivity(int id){
adapter.focus(id);
layout.removeAllViews();
Intent intent = null;
if(id == 0){
intent = new Intent(this,ActivityA.class);
}else if(id == 1){
intent = new Intent(this,ActivityB.class);
}else if(id == 2){
intent = new Intent(this,ActivityC.class);
}else if(id == 3){
intent = new Intent(this,ActivityD.class);
}
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Window group = getLocalActivityManager().startActivity("", intent);
layout.addView(group.getDecorView(),LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
}
}


main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<GridView
android:id="@+id/gridView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:numColumns="3" >
</GridView>
<LinearLayout
android:id="@+id/linearlayout"
android:layout_width="fill_parent"
android:layout_height="match_parent"
>
</LinearLayout>
</LinearLayout>


demo源码:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值