`

android之Tabhost深入讲解二

 
阅读更多

    之前一直认为TabHost不够灵活而使用ActivityGroup。看到了一个利用反射来控制TabHost的例子

先通过

tabHost.newTabSpec(CagConstant.TAB_TAG_CHANGE_INFO);

tabHost.newTabSpec(CagConstant.TAB_TAG_ROUTE_INFO);

tabHost.newTabSpec(CagConstant.TAB_TAG_STATION_INFO);

 

来获得TabSpec单个按钮的对象,之后setContent(ViewId)来设置选中状态效果。接下来通过反射

tabWidget.getClass().getDeclaredField("mBottomLeftStrip");
tabWidget.getClass().getDeclaredField("mBottomRightStrip");
(2.2之后改为mLeftStrip,mRightStrip) 

 

得到TabSpec左右两侧按钮的Field对象。然后解除访问限制setAccessible(true);设置未被选中时的背景。点击事件按钮背景的变化是通过for循环来判断的,个人感觉还有可以改进的地方。

package com.CustomTabhost;

import java.lang.reflect.Field;

import com.tab.R;

import android.app.TabActivity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabWidget;
import android.widget.TextView;

public class CustomTabhost extends TabActivity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		int width = 45;
		int height = 30;

		final TabHost tabs = getTabHost();
		final TabWidget tabWidget = tabs.getTabWidget();
//-----------------------------若是继承自Activity OR ActivityGroup-----------------------
//		TabHost tabHost=(TabHost)findViewById(R.id.tabhost); 	
//		tabs.addTab(tabs.newTabSpec("first tab").setIndicator("信息").setContent(new Intent(CustomTabhost.this, Load.class)));
//		注意此处我们用的是setContent(new Intent(CustomTabhost.this, Load.class))
//		那么tabHost.setup(this.getLocalActivityManager());必须继承ActivityGroup
//		若是用的是类似:mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB a").setContent(R.id.LinearLayout01));
//		则应该用tabHost.setup();  可以继承自Activity OR ActivityGroup
//		TabWidget tabWidget = tabs.getTabWidget();//此句话应该在setup方法后面,不然会为null,若是继承自TabActivity则不用考虑因为TabActivity已经帮我们封装实现了
//---------------------------------------------------------------------------------------
		Field mBottomLeftStrip;
		Field mBottomRightStrip;

		// LayoutInflater.from(this).inflate(R. layout.loading,
		// tabs.getTabContentView(), true);

		tabs.addTab(tabs.newTabSpec("first tab").setIndicator("信息").setContent(
				new Intent(CustomTabhost.this, Load.class)));

		tabs.addTab(tabs.newTabSpec("second tab").setIndicator("收藏")
				.setContent(new Intent(CustomTabhost.this, Load.class)));

		tabs.addTab(tabs.newTabSpec("second tab").setIndicator("设置")
				.setContent(new Intent(CustomTabhost.this, Load.class)));

		tabs.setCurrentTab(1);

		for (int i = 0; i < tabWidget.getChildCount(); i++) {
			/**
			 * 设置高度、宽度,不过宽度由于设置为fill_parent,在此对它没效果
			 */
			tabWidget.getChildAt(i).getLayoutParams().height = height;
			tabWidget.getChildAt(i).getLayoutParams().width = width;

			/**
			 * 设置tab中标题文字的颜色,不然默认为黑色
			 */
			final TextView tv = (TextView) tabWidget.getChildAt(i)
					.findViewById(android.R.id.title);

			tv.setTextColor(this.getResources().getColorStateList(
					android.R.color.white));

			/**
			 * 此方法是为了去掉系统默认的色白的底角
			 * 
			 * 在 TabWidget中mBottomLeftStrip、mBottomRightStrip
			 * 都是私有变量,但是我们可以通过反射来获取
			 * 
			 * 由于还不知道Android 2.2的接口是怎么样的,现在先加个判断好一些
			 */

			if (Integer.valueOf(Build.VERSION.SDK) <= 7) {
				try {
					mBottomLeftStrip = tabWidget.getClass().getDeclaredField(
							"mBottomLeftStrip");
					mBottomRightStrip = tabWidget.getClass().getDeclaredField(
							"mBottomRightStrip");
					if (!mBottomLeftStrip.isAccessible()) {
						mBottomLeftStrip.setAccessible(true);
					}
					if (!mBottomRightStrip.isAccessible()) {
						mBottomRightStrip.setAccessible(true);
					}
					mBottomLeftStrip.set(tabWidget, getResources().getDrawable(
							R.drawable.no));
					mBottomRightStrip.set(tabWidget, getResources()
							.getDrawable(R.drawable.no));
				} catch (Exception e) {
					e.printStackTrace();
				}
			} else {
				try {
					mBottomLeftStrip = tabWidget.getClass().getDeclaredField(
							"mLeftStrip");
					mBottomRightStrip = tabWidget.getClass().getDeclaredField(
							"mRightStrip");
					if (!mBottomLeftStrip.isAccessible()) {
						mBottomLeftStrip.setAccessible(true);
					}
					if (!mBottomRightStrip.isAccessible()) {
						mBottomRightStrip.setAccessible(true);
					}
					mBottomLeftStrip.set(tabWidget, getResources().getDrawable(
							R.drawable.no));
					mBottomRightStrip.set(tabWidget, getResources()
							.getDrawable(R.drawable.no));
				} catch (Exception e) { // TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			View vvv = tabWidget.getChildAt(i);
			if (tabs.getCurrentTab() == i) {
				vvv.setBackgroundDrawable(getResources().getDrawable(
						R.drawable.navbgfocus));
			} else {
				vvv.setBackgroundDrawable(getResources().getDrawable(
						R.drawable.menubg));
			}

		}
		/**
		 * 当点击tab选项卡的时候,更改当前的背景
		 */
		tabs.setOnTabChangedListener(new OnTabChangeListener() {
			@Override
			public void onTabChanged(String tabId) {
				// TODO Auto-generated method stub
				for (int i = 0; i < tabWidget.getChildCount(); i++) {
					View vvv = tabWidget.getChildAt(i);
					if (tabs.getCurrentTab() == i) {
						vvv.setBackgroundDrawable(getResources().getDrawable(
								R.drawable.menufocus));
					} else {
						vvv.setBackgroundDrawable(getResources().getDrawable(
								R.drawable.menubg));
					}
				}
			}
		});

	}

}

  

分享到:
评论

相关推荐

    Android-TabHost.rar_android_android tabhost_tabhost_tabhost andr

    本教程将深入讲解如何使用TabHost在Android应用中实现自定义的页签页面。 首先,我们需要理解TabHost的基本结构。TabHost包含两个主要部分:TabWidget和FrameLayout。TabWidget是显示页签的地方,而FrameLayout...

    android TabHost(标签)的使用

    本文将深入讲解如何在Android中使用TabHost,并通过一个简单实例来演示其基本用法。 首先,我们需要了解TabHost的基本结构。TabHost通常包含两个主要部分:TabWidget和FrameLayout。TabWidget负责显示和管理各个Tab...

    android 一个TabHost的例子

    本篇将深入讲解如何利用TabHost来构建一个简单的Android应用实例。 首先,我们需要了解TabHost的基本结构。TabHost由两部分组成:TabWidget和FrameLayout。TabWidget负责显示各个选项卡,而FrameLayout则承载每个...

    android TabHost全用法

    本教程将深入讲解如何使用TabHost实现全面的功能,帮助开发者掌握这一核心组件。 首先,TabHost是一个容器,它允许你将多个TabWidget(选项卡)和一个FrameLayout(内容区域)组合在一起。TabWidget显示选项卡,而...

    Android studio TabHost应用设计

    本教程将深入讲解如何在Android Studio中使用TabHost来设计应用程序。 首先,理解TabHost的基本概念是必要的。TabHost是一个容器,它可以容纳一个TabWidget(用于显示选项卡)和一个FrameLayout(用于展示被选中...

    andorid中TabHost的使用

    本文将深入讲解如何在Android应用程序中有效地使用TabHost。 一、TabHost概述 TabHost是Android SDK中的一个容器类,用于管理一组TabWidget(标签)和一个FrameLayout(帧布局),在这个帧布局中,我们可以切换显示...

    android使用了自定义button自定义tabHost切换页面Demo

    在Android开发中,自定义组件是提升应用独特性和用户体验的关键技术之一。本示例主要讲解如何使用自定义的Button和TabHost来实现页面间的切换,从而创建一个具有个性化标签导航功能的应用。 首先,我们来看看...

    android的自定义TabHost

    本篇文章将深入探讨如何在Android中自定义TabHost,以实现美观且功能丰富的界面。 首先,让我们理解TabHost的基本结构。TabHost通常包含两个主要部分:TabWidget和FrameLayout。TabWidget是显示标签的部分,而...

    android tabhost --android UI源码.rar

    下面将详细讲解TabHost的相关知识点。 1. **TabHost概述**:TabHost是一个容器,它允许开发者在一个布局中包含多个TabWidget(标签)和一个FrameLayout(内容区)。每个Tab都对应一个不同的Activity或Fragment,当...

    Android TabHost

    这篇博客详细讲解了如何使用TabHost来实现这一功能,我们将深入探讨这个主题。 首先,TabHost是Android提供的一个容器,它允许我们在一个Activity中创建多个TabWidget(选项卡)和一个FrameLayout(帧布局),帧...

    自定义android TabHost

    本教程将深入讲解如何实现自定义的`TabHost`,并提供一个底部的示例(`TabHostDemo`)来帮助你理解和实践这个功能。 ### 1. `TabHost`简介 `TabHost`是Android SDK中的一个容器,它用于管理多个`TabWidget`(选项卡...

    Android应用源码之嵌套TabHost示例.zip

    本示例"Android应用源码之嵌套TabHost示例.zip"深入探讨了如何在Android应用中实现嵌套的TabHost,这通常发生在需要在每个Tab中再分层次展示内容时。下面将详细讲解这个知识点。 首先,TabHost是Android SDK提供的...

    android tabhost 实例

    本实例将深入讲解如何使用TabHost来构建一个多页面的应用,让用户体验更加丰富和直观。 一、TabHost概述 TabHost是Android SDK中的一个类,它允许开发者在应用中实现多标签导航。通过TabHost,我们可以创建一个包含...

    简单的android选项卡Tab菜单TabHost(一)同一Activity上实现

    本文将深入探讨如何使用TabHost组件在同一Activity上实现简单的Android选项卡菜单。TabHost是Android SDK提供的一种用于构建多标签界面的容器,它允许我们在一个Activity内创建多个Tab,每个Tab对应一个单独的视图...

    Android组件必学之TabHost使用方法详解

    本文将深入讲解TabHost的使用方法,以及如何自定义它的显示样式。 首先,TabHost是Android系统提供的一个容器,它可以包含一个TabWidget(用于显示选项卡)和一个FrameLayout(用于显示每个选项卡的内容)。通常,...

    Android应用源码可以横向拖动的TabHost-IT计算机-毕业设计.zip

    在"Android应用源码可以横向拖动的TabHost"这个项目中,我们可以深入学习如何实现一个支持横向滑动的TabHost,这对于构建用户友好的多视图应用程序至关重要。以下将详细讲解相关知识点。 1. TabHost基本概念:...

    二,android开发经典实例系列----TabHost、Gallery

    在Android开发中,TabHost和Gallery是两个非常重要的组件,它们分别用于实现多标签页的切换和图片轮播效果。本文将深入解析这两个组件的使用方法,并通过一个经典的实例来展示它们如何协同工作。 首先,TabHost是...

    Android应用源码之封装的一个tabhost框架.zip

    本篇将详细讲解基于源码的"Android应用源码之封装的一个tabhost框架"。 首先,TabHost是Android SDK中的一个容器类,它允许开发者在同一个Activity中展示多个Fragments或Views,通过TabWidget(标签栏)和...

    viewPager和tabhost组合滑动,源码

    在Android开发中,`ViewPager`和`TabHost`是两种常用的组件,用于创建具有滑动导航和多标签视图的应用。本教程将深入探讨如何将它们结合使用,并提供相关的源码示例。`ViewPager`提供了水平滑动页面的效果,而`...

Global site tag (gtag.js) - Google Analytics