package com.laili.mytabhost;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.LayoutAnimationController;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TabHost;
import android.widget.TextView;
public class TestTabHostActivity extends Activity implements OnClickListener {
private TabHost tabHost;
private Button nextBtn_1;
private Button nextBtn_2;
private Button nextBtn_3;
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
int currentView = 0;
private static int maxTabIndex = 3;
private GestureDetector gestureDetector;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initView();
}
private void initView() {
tabHost=(TabHost)findViewById(R.id.TabHost01);
tabHost.setup();
tabHost.addTab(tabHost.newTabSpec("tab1").setContent(R.id.LinearLayout1)
.setIndicator(getTabView(R.drawable.ic_launcher,"会话",R.layout.tab_view)));
tabHost.addTab(tabHost.newTabSpec("tab2").setContent(R.id.LinearLayout2)
.setIndicator(getTabView(R.drawable.ic_launcher, "好友", R.layout.tab_view)));
tabHost.addTab(tabHost.newTabSpec("tab3").setContent(R.id.LinearLayout3)
.setIndicator(getTabView(R.drawable.ic_launcher, "名片", R.layout.tab_view)));
tabHost.addTab(tabHost.newTabSpec("tab4").setContent(R.id.LinearLayout4)
.setIndicator(getTabView(R.drawable.ic_launcher, "更多", R.layout.tab_view)));
tabHost.setCurrentTab(1);
tabHost.setSelected(false);
nextBtn_1 = (Button) findViewById(R.id.jump2next_btn_1);
nextBtn_2 = (Button) findViewById(R.id.jump2next_btn_2);
nextBtn_3 = (Button) findViewById(R.id.jump2next_btn_3);
nextBtn_1.setOnClickListener(this);
nextBtn_2.setOnClickListener(this);
nextBtn_3.setOnClickListener(this);
gestureDetector = new GestureDetector(new MyGestureListener());
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
gestureDetector.onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
setContentView(R.layout.main);
System.out.println("land");
}
if(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT){
setContentView(R.layout.main);
System.out.println("port");
}
}
/**
* 获得TabHost上填充tab的View
* @param icon
* @param label
* @param viewId
* @return
*/
private View getTabView(int icon, String label, int viewId) {
View localView = LayoutInflater.from(this).inflate(viewId, null);
ImageView iconView = (ImageView) localView.findViewById(R.id.icon);
TextView labelView = (TextView) localView.findViewById(R.id.label);
iconView.setBackgroundResource(icon);
labelView.setText(label);
return localView;
}
@Override
public void onClick(View v) {
System.out.println(tabHost.getChildCount());
if (tabHost.getCurrentTab() == maxTabIndex) {
tabHost.setCurrentTab(0);
} else {
tabHost.setCurrentTab(tabHost.getCurrentTab() + 1);
}
}
private class MyGestureListener extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// right to left swipe
if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Log.i("test ", "right");
if (currentView == maxTabIndex) {
currentView = 0;
} else {
currentView++;
}
tabHost.setCurrentTab(currentView);
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Log.i("test ", "left");
if (currentView == 0) {
currentView = maxTabIndex;
} else {
currentView--;
}
tabHost.setCurrentTab(currentView);
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
} // MyGestureListener
}
分享到:
相关推荐
在“自定义tabhost使用了不同默认的上标签切换页面”这一描述中,我们可以理解为每个Tab可能展示不同的内容,而这些内容可能是通过不同的Activity或Fragment来实现的。当用户点击不同的Tab时,TabHost会根据预设的...
然而,标准的TabHost功能有限,往往需要进行自定义以满足更复杂的需求,如动态添加选项、自动水平滑动以及手势切换选项卡。下面我们将深入探讨如何实现这样的自定义TabHost。 一、自定义TabHost的基本原理 自定义...
5. **动画效果**:为了增加用户体验,可以为Tab切换添加过渡动画,例如淡入淡出或者滑动效果。 6. **使用Fragment**:在现代Android开发中,通常推荐使用Fragment替换Activity,因为它们更容易管理和适应屏幕旋转等...
在Android开发中,`TabHost`是一个非常重要的组件,它用于创建带有多个选项卡的界面,每个选项卡对应一个不同的活动或视图。本示例是关于如何自定义`TabHost`,使其满足特定需求,如将标签置于页面底部,并且能够...
3. **切换事件监听**:通过`TabHost.OnTabChangeListener`接口,我们可以监听用户切换Tab的操作,以便进行相应的逻辑处理,如刷新当前页面内容。 4. **嵌套Fragment**:在新的Android版本中,使用Fragment来管理每...
在本教程中,我们将深入探讨如何自定义`TabHost`,实现图片和文字的切换,以及如何根据需求自由定义变更。 首先,我们需要了解`TabHost`的基本结构。`TabHost`由两部分组成:`TabWidget`和`FrameLayout`。`...
- **addTab()**:为TabHost添加新的Tab,指定标签名、图标以及切换到该标签时要显示的布局或Activity。 4. **实例化和使用自定义TabHost** - 在XML布局文件中声明TabHost,并根据需求配置TabWidget和FrameLayout...
在布局文件中,将自定义的TabHost作为根布局,确保背景图片位于TabHost之上。这样,当选项卡切换时,背景图片的滑动效果会与TabHost同步。 5. **编程实现**: 在Activity或Fragment中,实例化自定义的TabHost,并...
在Android开发中,TabHost是一个常用的组件,用于创建带有多个选项卡的应用界面。自定义TabHost可以帮助我们根据项目需求调整其样式、位置以及交互方式,从而提供更好的用户体验。本篇文章将详细讲解如何自定义...
在Android SDK中,TabHost提供了默认的实现,但我们常常需要对其进行自定义以满足特定需求,例如更改标签样式、添加动画效果等。 1. **创建TabHost实例** 在XML布局文件中,你需要创建一个TabHost,并为其设置ID为...
然后添加TabWidget和FrameLayout,接着用`TabHost.TabSpec`来定义每个标签,包括标签的文本、图标以及与之关联的活动或视图。最后,调用`setup()`方法来启动TabHost。 ```java TabHost tabHost = (TabHost) ...
2. **选项卡切换动画**:可以添加自定义动画效果,使选项卡在切换时更具有视觉吸引力。 3. **选项卡内容**:每个选项卡的内容可以是任何View,如Fragment、Activity或自定义ViewGroup。这为我们提供了丰富的可能性...
默认情况下,TabHost的样式可能不能满足所有设计需求,因此我们需要自定义其外观和行为。 1. 创建布局资源 在res/layout目录下,创建一个新的XML布局文件,例如`custom_tab_host.xml`。在这个文件中,我们可以...
在Android应用开发中,TabHost是一个非常重要的组件,它允许我们创建带有标签切换的界面,类似于许多移动应用的底部导航栏。默认的TabHost样式可能不符合所有开发者的设计需求,因此自定义TabHost就显得尤为关键。这...
3. **设置自定义视图**:通过`TabSpec.setIndicator()`使用自定义的`TabView`替换默认的标签指示器。 **注意事项:** 1. `TabHost`在新版本的Android SDK中已经被推荐替换为`BottomNavigationView`或者`ViewPager`+...
Android TabHost实现屏幕UI窗口的TAB切换功能,实现的过程:声明TabHost对象、取得TabHost对象,为TabHost添加标签,新建一个newTabSpec(newTabSpec),设置其标签和图标(setIndicator),设置内容(setContent),然后...
这个组件在早期的Android版本中广泛使用,为用户提供了一种便捷的方式来组织和切换不同的视图或活动。本文将深入探讨如何在Android中自定义TabHost,以简化开发过程并提高效率。 首先,我们要理解TabHost的基本结构...
在Android应用开发中,TabHost是一种常见的用于实现标签页切换的组件,它允许开发者在一个Activity中展示多个Fragments或者Views,通过不同的标签页来切换显示不同的内容。本篇将深入探讨TabHost的工作原理、实现...
本资源主要关注`TabHost`的切换动画及其基本工作原理。 首先,`TabHost`是Android提供的一个容器,它允许我们在一个活动中展示多个`Fragment`或`Activity`,每个`Tab`对应一个视图。在早期的Android版本中,`...
在Android开发中,`TabHost` 是一个非常重要的组件,用于创建带有标签页的应用界面。在传统的`TabHost`使用中,标签页通常显示为文字,但有时我们可能需要更个性化的布局,例如图片在左,文字在右。本教程将深入探讨...