Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 853|回复: 0

[实例教程]Android入门第十五篇之ActivityGroup + GridView 实现Tab

[复制链接]

该用户从未签到

发表于 2011-10-22 12:31:45 | 显示全部楼层 |阅读模式
很多客户端软件和浏览器软件都喜欢用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 = new ImageView(mContext);

                imgItems.setLayoutParams(new GridView.LayoutParams(width, height));//设置ImageView宽高

                imgItems.setAdjustViewBounds(false);

                //imgItems.setScaleType(ImageView.ScaleType.CENTER_CROP);

                imgItems.setPadding(2, 2, 2, 2);

                imgItems.setImageResource(picIds);

        }

    }



    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.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点是需要注意一下的。
SetNumColumns():必须要使用setNumColumns来设置列数,因为这个GridView只有一行,即所有的Item都在同一行,Item数量即为列数。
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);

        }



}
主Activity的布局XML文件源码如下:
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        androidrientation="vertical" android:layout_width="fill_parent"

        android:layout_height="fill_parent">

        <RelativeLayout android:layout_height="fill_parent"

                android:layout_width="fill_parent">

                <GridView android:layout_height="wrap_content" android:id="@+id/gvTopBar"

                        android:layout_alignParentTop="true" android:layout_width="fill_parent"

                        android:fadingEdgeLength="5dip" android:fadingEdge="vertical">

                </GridView>

                <LinearLayout android:id="@+id/Container"

                        android:layout_below="@+id/gvTopBar" android:layout_width="fill_parent"

                        android:layout_height="fill_parent">

                </LinearLayout>

        </RelativeLayout>

</LinearLayout>
回复

使用道具 举报

该用户从未签到

发表于 2011-10-22 12:31:51 | 显示全部楼层

Re:[实例教程]Android入门第十五篇之ActivityGroup

111111111111111111111
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 12:31:55 | 显示全部楼层

Re:[实例教程]Android入门第十五篇之ActivityGroup

111111111111111111111
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-12-23 09:27 , Processed in 1.179103 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表