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);
}
}
分享到:
相关推荐
在Android开发中,`TabHost`是一个非常重要的组件,它用于创建带有多个选项卡的界面,每个选项卡对应一个不同的活动或视图。本示例是关于如何自定义`TabHost`,使其满足特定需求,如将标签置于页面底部,并且能够...
在Android开发中,`TabHost`是一个非常重要的组件,它用于创建具有多个“标签”(tabs)的应用界面,每个标签代表一个不同的活动或视图。`TabHost`提供了用户友好的交互方式,允许用户通过点击标签在不同内容之间...
在Android开发中,自定义组件是提升应用独特性和用户体验的关键技术之一。本示例主要讲解如何使用自定义的Button和TabHost来实现页面间的切换,从而创建一个具有个性化标签导航功能的应用。 首先,我们来看看...
在Android开发中,TabHost是一个非常重要的组件,它允许开发者创建多标签的界面,类似于浏览器中的标签页。本文将深入探讨如何自定义TabHost来实现类似新浪微博的效果,从而提升用户体验和应用的交互性。 首先,...
在Android开发中,TabHost是一个非常重要的组件,它允许开发者创建多标签的界面,每个标签可以关联一个不同的Activity或者Fragment。然而,系统默认的TabHost功能有限,样式和交互方式可能无法满足所有项目的需求,...
在Android应用开发中,TabHost是一个非常常用的组件,它用于创建具有多个标签(Tab)的界面,每个标签对应一个不同的Activity或Fragment。本教程将详细讲解如何自定义TabHost,使其背景图片能够随着选项卡的切换而...
在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个选项卡的用户界面,每个选项卡都可以展示不同的内容区域。然而,系统默认的TabHost功能有限,样式和交互方式较为固定,因此开发者通常需要对其进行...
此外,这个自定义的`TabHost`还可以与其他组件结合,例如滑动菜单、悬浮按钮等,以构建更加复杂和交互丰富的Android应用。 在实际项目中,可能还需要处理点击事件、动态加载内容、切换动画等问题。`TabHost`的...
在Android开发中,TabHost是一个非常重要的组件,它允许开发者在一个Activity中创建多个Tab来展示不同的内容。本篇文章将深入探讨如何自定义TabHost样式,让应用界面更加美观且符合用户体验。 首先,我们需要理解...
在这个“自定义TabHost例子”中,我们将深入探讨如何创建一个类似微博底部Tab选项卡的UI组件。 首先,我们要理解TabHost的基本用法。TabHost是一个容器,它可以包含一个FrameLayout(通常称为"宿主")和一个...
在Android开发中,`TabHost`是一个非常重要的组件,它允许开发者在应用中创建具有多个选项卡的界面,每个选项卡都可以展示不同的内容或者活动。本教程将深入讲解如何实现自定义的`TabHost`,并提供一个底部的示例(`...
默认情况下,TabHost会将这两个组件放在屏幕底部,但我们可以通过自定义布局来改变它们的位置。 要自定义TabHost,我们需要以下几个步骤: 1. **创建布局文件**:首先,我们需要创建一个新的XML布局文件,例如`...
在Android开发中,`TabHost`和`ViewPager`是两种常用组件,用于构建具有多个页面切换功能的应用界面。本文将详细讲解如何自定义`TabHost`的样式,并将其与`ViewPager`和`Fragment`结合起来,以实现更丰富的用户体验...
不过,随着Android版本的更新,TabHost的使用逐渐被Fragment和BottomNavigationView等组件取代,但理解如何自定义TabHost仍然是Android开发中的一个重要技能,尤其是在处理旧项目或特定需求时。
在Android应用开发中,TabHost是一个非常重要的组件,它允许我们创建带有标签切换的界面,类似于许多移动应用的底部导航栏。默认的TabHost样式可能不符合所有开发者的设计需求,因此自定义TabHost就显得尤为关键。这...
在Android开发中,`TabHost`是一个非常重要的组件,它用于创建具有多个标签页的应用界面。自定义`TabHost`可以让我们根据需求构建更加个性化和功能丰富的用户界面。本篇文章将详细讲解如何实现一个自定义的`TabHost`...
在Android应用开发中,TabHost是一个非常常用的组件,它用于创建具有多个标签(Tab)的界面,每个标签对应一个不同的Activity。本篇文章将详细介绍如何通过自定义TabHost来实现Activity之间的跳转,以及如何设计一个...
在Android应用开发中,TabHost是一个非常重要的组件,它允许我们创建带有多个选项卡的应用界面。这个组件在早期的Android版本中广泛使用,为用户提供了一种便捷的方式来组织和切换不同的视图或活动。本文将深入探讨...
在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个选项卡的界面,每个选项卡可以展示不同的活动或视图。本篇文章将深入探讨如何自定义TabHost的样式,包括使用Activity对象作为内容和使用View对象...
自定义TabHost的关键在于通过编程方式或XML布局文件来配置这两个组件,以满足特定的设计需求。 1. **编程式创建TabHost** 通过代码创建TabHost,你需要实例化TabHost,并设置其ID为"android:id/tabhost"。然后添加...