`
wiley
  • 浏览: 253939 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

自定义组件—TabHost

阅读更多
package cn.madfinger.android.core.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

/**
 * Tab栏 控件
 * @author wiley.wang
 */
public class TabHostView extends LinearLayout {
	private int mCount;
	private View tabViews[];
	private int mSelected = -1;

	public TabHostView(Context context) {
		super(context);
	}

	public TabHostView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	protected void onFinishInflate() {
		mCount = this.getChildCount();
		tabViews = new View[mCount];
		for (int i = 0; i < mCount; i++) {
			tabViews[i] = this.getChildAt(i);
			tabViews[i].setOnClickListener(clickEvent);
		}
	}

	private View.OnClickListener clickEvent = new OnClickListener() {
		@Override
		public void onClick(View v) {
			int index = -1;
			for (int i = 0; i < mCount; i++) {
				if (tabViews[i] == v) {
					index = i;
					break;
				}
			}
			if (null == onTabChangedListener)
				return;
			if (onTabChangedListener.onClick(index)) {// 执行回调事件
				setFocus(index);// 回调成功后切换焦点
			}
		}

	};
	
	public void onClickTab(int index) {
		if(index<0&&index>=mCount)return;
		if(onTabChangedListener.onClick(index)) {
			setFocus(index);
		}
	}

	private void setFocus(int index) {
		if (index >= mCount || index == mSelected)
			return;

		if (mSelected > -1) {
			if (tabViews[mSelected] instanceof ViewGroup) {
				ViewGroup group = ((ViewGroup) tabViews[mSelected]);
				int childCount = group.getChildCount();
				for (int i = 0; i < childCount; i++) {
					group.getChildAt(i).setSelected(false);
				}
			} else {
				tabViews[mSelected].setSelected(false);
			}
		}

		View tabView = tabViews[index];
		if (tabView instanceof ViewGroup) {
			ViewGroup group = ((ViewGroup) tabView);
			int childCount = group.getChildCount();
			for (int i = 0; i < childCount; i++) {
				group.getChildAt(i).setSelected(true);
			}
		} else {
			tabView.setSelected(true);
		}
		mSelected = index;
	}

	private onTabChangedListener onTabChangedListener;

	public void setOnTabChangedListener(onTabChangedListener l) {
		onTabChangedListener = l;
	}

	public interface onTabChangedListener {
		boolean onClick(int index);
	}

}

 

<?xml version="1.0" encoding="utf-8"?>
<!--  -->
<cn.madfinger.android.core.view.TabHostView
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="horizontal"
	android:layout_height="60dip" 
	android:layout_width="fill_parent"	
	>

	<RelativeLayout android:id="@+id/layout1"
		android:layout_width="fill_parent" 
		android:layout_height="fill_parent" 
		android:layout_weight="1.0"
		android:layout_gravity="center_vertical"
		android:layout_margin="2dip"
		>
		<ImageView android:id="@+id/tab1"
			android:layout_width="wrap_content" 
			android:layout_height="wrap_content" 
			android:src="@drawable/icon"
			android:layout_centerInParent="true"
			/>
	</RelativeLayout>
    
	<RelativeLayout android:id="@+id/layout2"
		android:layout_width="fill_parent" 
		android:layout_height="fill_parent" 
		android:layout_weight="1.0"
		android:layout_gravity="center_vertical"
		android:layout_margin="2dip"
		>
		<ImageView android:id="@+id/tab2"
			android:layout_width="wrap_content" 
			android:layout_height="wrap_content" 
			android:src="@drawable/icon"
			android:layout_centerInParent="true"
			/>
	</RelativeLayout>
    
	<RelativeLayout android:id="@+id/layout3"
		android:layout_width="fill_parent" 
		android:layout_height="fill_parent" 
		android:layout_weight="1.0"
		android:layout_gravity="center_vertical"
		android:layout_margin="2dip"
		>
		<ImageView android:id="@+id/tab3"
			android:layout_width="wrap_content" 
			android:layout_height="wrap_content" 
			android:src="@drawable/icon"
			android:layout_centerInParent="true"
			/>
	</RelativeLayout>
    
	<RelativeLayout android:id="@+id/layout4"
		android:layout_width="fill_parent" 
		android:layout_height="fill_parent" 
		android:layout_weight="1.0"
		android:layout_gravity="center_vertical"
		android:layout_margin="2dip"
		>
		<ImageView android:id="@+id/tab4"
			android:layout_width="wrap_content" 
			android:layout_height="wrap_content" 
			android:src="@drawable/icon"
			android:layout_centerInParent="true"
			/>
	</RelativeLayout>
    
</cn.madfinger.android.core.view.TabHostView>

 

package cn.company.android.project.ui;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Toast;
import android.widget.ViewFlipper;
import cn.company.android.project.R;
import cn.company.android.project.util.Constants;
import cn.madfinger.android.core.view.TabHostView;

public class MainActivity extends Activity {
	/** Called when the activity is first created. */
	private static String TAG = MainActivity.class.getSimpleName();
	private Context mContext=null;
	private MyApplication mApplication = null;
	private TabHostView mTabHost = null;
	private ViewFlipper mViewFlipper = null;

	private Animation mInLeftAnim;
	private Animation mOutLeftAnim;
	private Animation mInRightAnim;
	private Animation mOutRightAnim;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.main);
		mApplication = (MyApplication) this.getApplication();
		mContext=this;
		initCtrl();

		
	}

	private void initCtrl() {
		//初始化TabHost
		mTabHost = (TabHostView) findViewById(R.id.tabhost);
		mTabHost.setOnTabChangedListener(onTabChangedListener);
		
		//初始化ViewFlipper
		mViewFlipper = (ViewFlipper) findViewById(R.id.viewflipper);
		
		//初始化按钮
		
		// 初始化动画
		mInLeftAnim = AnimationUtils.loadAnimation(this, R.anim.anim_in_left);
		mOutLeftAnim = AnimationUtils.loadAnimation(this, R.anim.anim_out_left);
		mInRightAnim = AnimationUtils.loadAnimation(this, R.anim.anim_in_right);
		mOutRightAnim = AnimationUtils.loadAnimation(this,
				R.anim.anim_out_right);
	}

	//切换TAB
	public void setFocusTab(int index) {
		mTabHost.onClickTab(index);
	}

	TabHostView.onTabChangedListener onTabChangedListener = new TabHostView.onTabChangedListener() {
		@Override
		public boolean onClick(int index) {//tabIndex
			Toast.makeText(mContext, ""+index, Toast.LENGTH_SHORT).show();
			return true;
		}
	};

	// 切换切图时动画效果
	public void changeViewAnimation(int index, boolean anim) {

	}

	@Override
	protected void onResume() {
		super.onResume();

	}

	// 切回Activity时执行
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (resultCode == RESULT_OK) {
			int funId = data.getIntExtra(Constants.FUNCTION_KEY, 0);
			Log.d(TAG, "onActivityResult:RESULT_OK");
			Log.d(TAG, "FUNCTION:" + funId);
			switch (funId) {
			case Constants.FUNCTION_1:

				break;
			case Constants.FUNCTION_2:

				break;
			case Constants.FUNCTION_3:

				break;
			}
		}
		super.onActivityResult(requestCode, resultCode, data);
	}

	// 按键时执行
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// 实现按健监听
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			new AlertDialog.Builder(this).setTitle("确认退出吗?").setIcon(
					android.R.drawable.ic_menu_help).setCancelable(false)
					.setPositiveButton("确定",
							new DialogInterface.OnClickListener() {
								@Override
								public void onClick(DialogInterface dialog,
										int which) {
									// 退出
									finish(); //
									System.exit(0);
								}
							}).setNegativeButton("取消",
							new DialogInterface.OnClickListener() {
								@Override
								public void onClick(DialogInterface dialog,
										int which) {
								}
							}).show();
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}
}

 

分享到:
评论

相关推荐

    自定义TabHost最简Demo源代码

    在Android开发中,`TabHost`是一个非常重要的组件,它用于创建带有多个选项卡的界面,每个选项卡对应一个不同的活动或视图。本示例是关于如何自定义`TabHost`,使其满足特定需求,如将标签置于页面底部,并且能够...

    自定义TabHost实现

    在Android开发中,`TabHost`是一个非常重要的组件,它用于创建具有多个“标签”(tabs)的应用界面,每个标签代表一个不同的活动或视图。`TabHost`提供了用户友好的交互方式,允许用户通过点击标签在不同内容之间...

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

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

    android自定义tabhost

    在Android开发中,TabHost是一个非常重要的组件,它允许开发者创建多标签的界面,类似于浏览器中的标签页。本文将深入探讨如何自定义TabHost来实现类似新浪微博的效果,从而提升用户体验和应用的交互性。 首先,...

    android--自定义TabHost

    在Android开发中,TabHost是一个非常重要的组件,它允许开发者创建多标签的界面,每个标签可以关联一个不同的Activity或者Fragment。然而,系统默认的TabHost功能有限,样式和交互方式可能无法满足所有项目的需求,...

    自定义TabHost实现背景图片随选项卡切换滑动效果

    在Android应用开发中,TabHost是一个非常常用的组件,它用于创建具有多个标签(Tab)的界面,每个标签对应一个不同的Activity或Fragment。本教程将详细讲解如何自定义TabHost,使其背景图片能够随着选项卡的切换而...

    自定义TabHost经典案例

    在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个选项卡的用户界面,每个选项卡都可以展示不同的内容区域。然而,系统默认的TabHost功能有限,样式和交互方式较为固定,因此开发者通常需要对其进行...

    自定义TabHost 图片在左文字在右

    此外,这个自定义的`TabHost`还可以与其他组件结合,例如滑动菜单、悬浮按钮等,以构建更加复杂和交互丰富的Android应用。 在实际项目中,可能还需要处理点击事件、动态加载内容、切换动画等问题。`TabHost`的...

    android自定义tabhost样式

    在Android开发中,TabHost是一个非常重要的组件,它允许开发者在一个Activity中创建多个Tab来展示不同的内容。本篇文章将深入探讨如何自定义TabHost样式,让应用界面更加美观且符合用户体验。 首先,我们需要理解...

    自定义TabHost例子,类似于微博下面的Tab选项卡

    在这个“自定义TabHost例子”中,我们将深入探讨如何创建一个类似微博底部Tab选项卡的UI组件。 首先,我们要理解TabHost的基本用法。TabHost是一个容器,它可以包含一个FrameLayout(通常称为"宿主")和一个...

    自定义android TabHost

    在Android开发中,`TabHost`是一个非常重要的组件,它允许开发者在应用中创建具有多个选项卡的界面,每个选项卡都可以展示不同的内容或者活动。本教程将深入讲解如何实现自定义的`TabHost`,并提供一个底部的示例(`...

    自定义tabhost

    默认情况下,TabHost会将这两个组件放在屏幕底部,但我们可以通过自定义布局来改变它们的位置。 要自定义TabHost,我们需要以下几个步骤: 1. **创建布局文件**:首先,我们需要创建一个新的XML布局文件,例如`...

    自定义Tabhost,ViewPager的滑动

    在Android开发中,`TabHost`和`ViewPager`是两种常用组件,用于构建具有多个页面切换功能的应用界面。本文将详细讲解如何自定义`TabHost`的样式,并将其与`ViewPager`和`Fragment`结合起来,以实现更丰富的用户体验...

    android自定义TabHost

    不过,随着Android版本的更新,TabHost的使用逐渐被Fragment和BottomNavigationView等组件取代,但理解如何自定义TabHost仍然是Android开发中的一个重要技能,尤其是在处理旧项目或特定需求时。

    【Android】底部、自定义Tabhost的应用

    在Android应用开发中,TabHost是一个非常重要的组件,它允许我们创建带有标签切换的界面,类似于许多移动应用的底部导航栏。默认的TabHost样式可能不符合所有开发者的设计需求,因此自定义TabHost就显得尤为关键。这...

    自定义TabHost

    在Android开发中,`TabHost`是一个非常重要的组件,它用于创建具有多个标签页的应用界面。自定义`TabHost`可以让我们根据需求构建更加个性化和功能丰富的用户界面。本篇文章将详细讲解如何实现一个自定义的`TabHost`...

    自定义tabhost实现activity 的跳转

    在Android应用开发中,TabHost是一个非常常用的组件,它用于创建具有多个标签(Tab)的界面,每个标签对应一个不同的Activity。本篇文章将详细介绍如何通过自定义TabHost来实现Activity之间的跳转,以及如何设计一个...

    android TabHost自定义选项卡

    在Android应用开发中,TabHost是一个非常重要的组件,它允许我们创建带有多个选项卡的应用界面。这个组件在早期的Android版本中广泛使用,为用户提供了一种便捷的方式来组织和切换不同的视图或活动。本文将深入探讨...

    TabHost自定义样式 自定义TabWidget

    在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个选项卡的界面,每个选项卡可以展示不同的活动或视图。本篇文章将深入探讨如何自定义TabHost的样式,包括使用Activity对象作为内容和使用View对象...

    android的自定义TabHost

    自定义TabHost的关键在于通过编程方式或XML布局文件来配置这两个组件,以满足特定的设计需求。 1. **编程式创建TabHost** 通过代码创建TabHost,你需要实例化TabHost,并设置其ID为"android:id/tabhost"。然后添加...

Global site tag (gtag.js) - Google Analytics