Android 底部TabActivity(3)——ActivityGroup|顶部底部均有Tab标签之二

上一篇使用过时的ActivityGroup简单实现了顶部底部均有Tab标签的效果,是页面底部只有文字的样式,今天想完善一下效果,底部实现文字加图标的样式。

本文属于半成品,本来想着放弃的,想着先放博客吧,好歹也是一种思路,以后作参考用!追求完美效果的可以忽略本篇,我会在后续文章中实现更优的效果!

先看下效果图

首先是主页面MainActivity.java,这种方式其实不是真正意义上的Tab,只是实现了这样的效果。底部用了GridView实现三个切换开关,放到页面底部。

package sun.geoffery.tabtopbottom;

import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

/**
 * All rights Reserved, Designed By GeofferySun
 *
 * @Title: MainActivity.java
 * @Package sun.geoffery.tabtopbottom
 * @Description:上下都有Tab的界面
 * @author: GeofferySun
 * @date: 2014-12-9 下午3:41:04
 * @version V1.0
 */
public class MainActivity extends ActivityGroup {

	public static Class mTabClassAry[]= {
		HomeActivity.class,
		OrderActivity.class,
		WalletActivity.class};
	public static String mTabTxtAry[] = {"主页", "订单", "钱包"};
	public static int mTabImgAry[] = {
		R.drawable.ic_launcher,
		R.drawable.ic_launcher,
		R.drawable.ic_launcher};

	private int mCurTab;
	private final static int FLAG_EVENT = 0X100;
	private GridView mTabGridView;
	private GridViewAdapter mTabAdapter;
	private LinearLayout mContainer; // 装载sub Activity的容器

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);

		initView();
	}

	private void initView() {
		mContainer = (LinearLayout) findViewById(R.id.Container);
		mTabGridView = (GridView) findViewById(R.id.bottom_tab);
		// 禁止GridView滚动
		mTabGridView.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				return MotionEvent.ACTION_MOVE == event.getAction() ? true : false;
			}
		});

		mTabAdapter = new GridViewAdapter(this, mTabImgAry, mTabTxtAry);
		mTabGridView.setAdapter(mTabAdapter);
		mTabGridView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				switchActivity(position);
			}
		});

		mCurTab = -1;
		mHandler.sendEmptyMessageDelayed(FLAG_EVENT, 100);
	}

	Handler mHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case FLAG_EVENT:
				switchActivity(0);
				break;
			}
		}

	};

	private void switchActivity(int index) {
		if (index < 0 || index >= mTabClassAry.length) {
			return;
		}

		if (mCurTab == index) {
			return;
		}

		if (mCurTab != -1) {
			mTabGridView.getChildAt(mCurTab).setBackgroundDrawable(null);
		}

//		mTabGridView.getChildAt(index).setBackgroundResource(R.drawable.tab_item_d);

		mCurTab = index;

		mContainer.removeAllViews();
		Intent intent = new Intent(this, mTabClassAry[index]);

		String name = index + " subactivity";
		// Activity 转为 View
		Window subActivity = getLocalActivityManager().startActivity(name, intent);

		View child = subActivity.getDecorView();
		LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
		child.setLayoutParams(params);
		// 容器添加View
		mContainer.addView(child);
	}
}

主页面对应的页面文件

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

    <LinearLayout
        android:id="@+id/Container"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal"
        android:layout_above="@+id/bottom_tab" />

    <GridView
        android:id="@+id/bottom_tab"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="#404040"
        android:listSelector="@android:color/transparent"
        android:numColumns="3"
        android:padding="2dp" />

</RelativeLayout>

底部的GridView需要一个适配器GridViewAdapter.java,Item就是上边一个图标、下边一个文字。

</pre><pre name="code" class="java">package sun.geoffery.tabtopbottom;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class GridViewAdapter extends BaseAdapter {
	Context mContext;
	LayoutInflater mLayoutInflater;
	int mImageviewArray[];
	String mTextViewArray[];

	public GridViewAdapter(Context context, int imageViewArray[], String textViewArray[]) {

		mContext = context;
		mLayoutInflater = LayoutInflater.from(context);
		mImageviewArray = imageViewArray;
		mTextViewArray = textViewArray;
	}

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

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		if (convertView == null) {
			convertView = mLayoutInflater.inflate(R.layout.tab_item_view, null);
		}

		ImageView imageView = (ImageView) convertView
				.findViewById(R.id.imageview);
		imageView.setBackgroundResource(mImageviewArray[position]);

		TextView textView = (TextView) convertView.findViewById(R.id.textview);
		textView.setText(mTextViewArray[position]);

		return convertView;

	}

	@Override
	public int getCount() {
		return mImageviewArray.length;
	}

}

每个Item对应的布局文件tab_item_view.xml如下

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

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:padding="3dp" >
    </ImageView>

    <TextView
        android:id="@+id/textview"
        style="@style/tab_item_text_style"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </TextView>

</LinearLayout>

至于其他页面还是上一篇文章中的代码,没有改动。

没看明白的直接去查看源码吧!

采集

采集

时间: 2024-08-07 00:13:22

Android 底部TabActivity(3)——ActivityGroup|顶部底部均有Tab标签之二的相关文章

Android自定义TabActivity(实现仿新浪微博底部菜单更新UI)

如今Android上很多应用都采用底部菜单控制更新的UI这种框架,例如新浪微博 点击底部菜单的选项可以更新界面.底部菜单可以使用TabHost来实现,不过用过TabHost的人都知道自定义TabHost究竟是有多麻烦的,原生TabHost的风格是不依附屏幕的底部的,要依附底部就要重写布局. TabHost设置的Container可以管理UI的显示,UI可以用LayoutInflater动态生成,也可以是Activity,但不好管理Activity的生命周期.然后用TabHost控制显示UI的显示

【FastDev4Android框架开发】Android Design支持库TabLayout打造仿网易新闻Tab标签效果(三十七)

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50158985 本文出自:[江清清的博客] (一).前言: 仿36Kr客户端开发过程中,因为他们网站上面的新闻文章分类比较多,所以我这边还是打算模仿网易新闻APP的主界面新闻标签Tab以及页面滑动效果来进行实现.要实现的顶部的Tab标签的效果有很多方法例如采用开源项目ViewPagerIndicator中的TabPageIndicator就可以实现.不过我们今天不讲V

Android 底部TabActivity(0)——开篇(界面分析|系列文章文件夹)

当下主流的软件没有一个统一明白的风格,App框架什么样的都有,但个人钟情于页面底部Tab分签架构,移动设备的屏幕尽管越来越大,可是显示的内容还是有限,为了能展示很多其它的内容,方便简洁的操作习惯中Tab架构是不二选择,分为顶部Tab和底部Tab.所以小山准备出一系列关于Tab的Blog,作为自己代码备份,也希望能帮到大家扩展开发思路,那就更是功德无量了.因为是Blog解说,代码尽量简单为好,不会大量的抽取重构,也尽量少使用资源文件,原理为中心. 看看当前比較经常使用的App中使用底部Tab的明星

Android 底部TabActivity(2)——ActivityGroup

今天这篇文章记述一下页面顶部底部上下均有Tab标签页的特殊需求!使用了过时的ActivityGroup. 再看一下整个Project的结构,如下 下面逐一介绍一下实现过程,一贯风格,具体实现还是看注释吧,代码也不是很多,就不啰嗦了. step1:首先是主界面MainActivity.java package sun.geoffery.tabtopbottom; import android.app.ActivityGroup; import android.content.Intent; imp

Android 底部TabActivity(0)——开篇(界面分析)

当下主流的软件没有一个统一明确的风格,App框架什么样的都有,但个人钟情于页面底部Tab分签架构,移动设备的屏幕虽然越来越大,但是显示的内容还是有限,为了能展示更多的内容,方便简洁的操作习惯中Tab架构是不二选择,分为顶部Tab和底部Tab.所以小山准备出一系列关于Tab的Blog,作为自己代码备份,也希望能帮到大家扩展开发思路,那就更是功德无量了.由于是Blog讲解,代码尽量简单为好,不会大量的抽取重构,也尽量少使用资源文件,原理为中心. 看看当前比较常用的App中使用底部Tab的明星软件,先

Android 自定义ListView实现底部分页刷新与顶部下拉刷新

在项目开发中,由于数据过大时,需要进行分页加载或下拉刷新,来缓解一次性加载的过长等待.本篇博文实例讲解通过自定义的ListView实现底部分页加载和顶部下拉刷新的效果. 其效果图: 一.ListView 底部分页加载 整个底部分页加载,主要分一下几步: 1.加载底部自定义View; 2.响应OnScrollListener监听事件,onScroll方法记录最后可见的View Item以及整个totalItemCount.当onScrollStateChanged状态改变时, 当滑动到底端,并滑动

Android 自定义ListView实现底部分页刷新与顶部下拉刷新,androidlistview

在项目开发中,由于数据过大时,需要进行分页加载或下拉刷新,来缓解一次性加载的过长等待.本篇博文实例讲解通过自定义的ListView实现底部分页加载和顶部下拉刷新的效果. 其效果图: 一.ListView 底部分页加载 整个底部分页加载,主要分一下几步: 1.加载底部自定义View; 2.响应OnScrollListener监听事件,onScroll方法记录最后可见的View Item以及整个totalItemCount.当onScrollStateChanged状态改变时, 当滑动到底端,并滑动

Android View滚动、拉伸到顶/底部弹性回弹复位

 <Android View滚动.拉伸到顶/底部弹性回弹复位> 我在上一篇文章介绍了如何实现一个Android ListView拉到顶/底部后,像橡皮筋一样弹性回弹复位(<Android ListView拉到顶/底部,像橡皮筋一样弹性回弹复位>,文章链接地址: http://blog.csdn.net/zhangphil/article/details/47311155 ).事实上,Android凡是由ScrollView包裹的控件,均可实现滚动到顶/底部,弹性回弹复位的交互设

(转载)Android两种Tab分页的方式:TabActivity和ActivityGroup以及Android项目几种常见的应用架构

在Android里面Tab分页,常用的方法有两种: 一.TabActivity和TabHost的结合 1.主类继承TabActivity public class Tagpage extends TabActivity 2.获取当前TabHost对象 final TabHost tabHost = getTabHost(); 3.添加Tab分页标签,这里就是关键,把每个分页面链接成Activity.页面的跳转,即是Activity的跳转. tabHost.addTab(tabHost.newTa