`
thunder_yan
  • 浏览: 113343 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ActivityGroup + ViewPager 实现可滑动的底部Tab

阅读更多

首先看看布局文件

main.xml

<?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"
    android:orientation="vertical" >

    <!-- 底部Tab -->
    <LinearLayout
        android:id="@+id/ly_tab"
        android:layout_width="fill_parent"
        android:layout_height="55dip"
        android:layout_alignParentBottom="true"
        android:background="@drawable/tab_background"
        android:orientation="horizontal" >

        <!-- Tab可以滑动的ViewPager -->
        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
    </LinearLayout>

    <!-- 中间显示内容的LinerLayout -->
    <LinearLayout
        android:id="@+id/ly_container"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@id/ly_tab" />

</RelativeLayout>

 ViewPager 的 一个页面的配置文件

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

    <ImageView
        android:id="@+id/imageView_tab_item_frist"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1.0"
        android:background="@drawable/gray_takeout_96_80_1"
        android:contentDescription="@string/imageView"
        android:fadingEdge="vertical"
        android:fadingEdgeLength="5dip"
        android:onClick="onClick"
        android:tag="1" />

    <ImageView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1.0"
        android:background="@drawable/gray_play_96_80_1"
        android:contentDescription="@string/imageView"
        android:fadingEdge="vertical"
        android:fadingEdgeLength="5dip"
        android:onClick="onClick"
        android:tag="2" />

    <ImageView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1.0"
        android:background="@drawable/gray_express_96_80_1"
        android:contentDescription="@string/imageView"
        android:fadingEdge="vertical"
        android:fadingEdgeLength="5dip"
        android:onClick="onClick"
        android:tag="3" />

    <ImageView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1.0"
        android:background="@drawable/gray_logistics_96_80_1"
        android:contentDescription="@string/imageView"
        android:fadingEdge="vertical"
        android:fadingEdgeLength="5dip"
        android:onClick="onClick"
        android:tag="4" />

</LinearLayout>

 

 

因为用到了ViewPager组件, 而Android本身自带是没有这个组件的。

因此需要加载ViewPager的jar包, android-support-v4.jar

这个jar包, 在谷歌自带的SDK的android-sdk-windows\extras\android\support\v4目录下面就有

 

 

然后是看看java类:

/**
 * 主界面多选项卡选择Activity
 * @author Thunder
 *
 */
public class TabChooseActivity extends ActivityGroup {
	
	/* */
	private LayoutInflater layoutInflater = null;
	
	/* 一些对话框 */
	private AboutDialog aboutDialog = null;
	private AboutCFDialog aboutCFDialog = null;
	
	/* 一些常量  */
	private static final int CASE_TAKE_OUT = 0;
	private static final int CASE_PLAY = 1;
	private static final int CASE_EXPRESS = 2;
	private static final int CASE_LOGISTICS = 3;
	private static final int CASE_SPIN_PANEL = 4;
	
	/* ActivityGroup实现Tab */
	private static final int PAGE_COUNT = 2;
	private List<View> viewList = null;
	private ViewGroup viewGroup = null;
	private ViewPager viewPager = null;
	private LinearLayout ly_container = null;
	
	/* Tab的一些资源 */
	private View preView = null;
	private int preIndex = 0;
	private int[] img_bg_normal = {R.drawable.gray_takeout_96_80_1, 
			R.drawable.gray_play_96_80_1, R.drawable.gray_express_96_80_1,
			R.drawable.gray_logistics_96_80_1, R.drawable.gray_spin_panel_96_80_1,
			R.drawable.gray_logistics_96_80_1, R.drawable.gray_refresh_96_80_1,
			R.drawable.gray_more_96_80_1};
	private int[] img_bg_foucs = {R.drawable.blue_takeout_96_80_1, 
			R.drawable.blue_play_96_80_1, R.drawable.blue_express_96_80_1,
			R.drawable.blue_logistics_96_80_1, R.drawable.blue_spin_panel_96_80_1,
			R.drawable.blue_logistics_96_80_1, R.drawable.blue_refresh_96_80_1,
			R.drawable.gray_more_96_80_1};
	
	
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        /* 初始化函数 */
        init();
        
        /* 设置显示的View */
        setContentView(viewGroup);
    }
    
    /**
     * 初始化函数
     */
    private void init() {
    	
    			
    	/* 得到 LayoutInflater */
    	layoutInflater = getLayoutInflater();
        
    	/* ViewList 用户存放每一个TabItem页  */
    	viewList = new ArrayList<View>();
    	
    	/* 设置默认第一个Tab Item 是选中状态  */
        View tempView = layoutInflater.inflate(R.layout.page_item_1, null);
        preView = tempView.findViewById(R.id.imageView_tab_item_frist);
        preIndex = 0;
        setImgFocus(preIndex, preView);
        
        /* 添加每一页面的显示页面 */
        viewList.add(tempView);
        viewList.add(layoutInflater.inflate(R.layout.page_item_2, null));
        
        /* 反射出布局 */
        viewGroup = (ViewGroup) layoutInflater.inflate(R.layout.main, null);
        viewPager = (ViewPager) viewGroup.findViewById(R.id.viewPager);
        
		/* 初始化对话框 */
		aboutDialog = new AboutDialog(this);
		aboutCFDialog = new AboutCFDialog(this);
        
        /* 用于中间显示内容的容器, 其实就是一个LinearLayout */
        ly_container = (LinearLayout) viewGroup.findViewById(R.id.ly_container);
        
        /* 让ViewPager加载数据页  */
        viewPager.setAdapter(new ViewPagerAdapter());
        
        /* 默认启动一个Tab 项的Activity */
        switchActivity(preIndex);
    }
    
    /**
     * View 的点击事件
     * @param view
     */
    public void onClick(View view) {
    	int index = Integer.parseInt(view.getTag().toString()) - 1;
    	setImgNormal();
    	setImgFocus(index, view);
    	preView = view;
    	preIndex = index;
    	switchActivity(index);
    }
    
    /**
     * 把原来的聚焦状态设置为正常状态
     */
    public void setImgNormal() {
    	if (preView != null) {
    		((ImageView) preView).setBackgroundResource(img_bg_normal[preIndex]);
    	}
    }
    
    /**
     * 把原来的正常状态设置为聚焦状态
     * @param index
     * @param view
     */
    public void setImgFocus(int index, View view) {
    	((ImageView) view).setBackgroundResource(img_bg_foucs[index]);
    }
    
    /**
     * ActivityGroup的切换
     * @param index
     */
	private void switchActivity(int index) {
		// 必须先清除容器中所有的View
		ly_container.removeAllViews();
		
		/* Intent 对象  */
		Intent intent = null;
		
		/* 匹配实例化Intent */
		switch (index) {
		case CASE_TAKE_OUT:
			intent = new Intent(this, TakeOutActivity.class);
			break;
		case CASE_PLAY:
			intent = new Intent(this, PlayActivity.class);
			break;
		case CASE_EXPRESS:
			intent = new Intent(this, ExpressActivity.class);
			break;
		case CASE_LOGISTICS:
			intent = new Intent(this, LogisticsActivity.class);
			break;
		case CASE_SPIN_PANEL:
			intent = new Intent(this, SpinPanelActivity.class);
			break;
		default:
			break;
		}
		
		/* 设置此Activity的标志位 */
		intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
		/* Activity 转为 View */
		Window subActivity = getLocalActivityManager().startActivity(
				"subActivity", intent);
		/* 容器添加View */
		ly_container.addView(subActivity.getDecorView(),
				LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
	}
    
    /**
	 * ViewPager 的 Adapter
	 * @author Thunder
	 *
	 */
	private class ViewPagerAdapter extends PagerAdapter {

		@Override
		public int getCount() {
			// 页面的数量
			return PAGE_COUNT;
		}

		@Override
		public Object instantiateItem(View container, int position) {
			// 加入到ViewGroup中去
			((ViewPager) container).addView(viewList.get(position), 0);
			return viewList.get(position);
		}

		@Override
		public void destroyItem(View container, int position, Object object) {
			((ViewPager) container).removeView(viewList.get(position));
		}

		@Override
		public boolean isViewFromObject(View view, Object object) {
			return view == object;
		}

		@Override
		public void finishUpdate(View arg0) {
		}

		@Override
		public void restoreState(Parcelable arg0, ClassLoader arg1) {
		}

		@Override
		public Parcelable saveState() {
			return null;
		}

		@Override
		public void startUpdate(View arg0) {
		}
	}
	
	

}

 具体实现, 上面的注释已经写得很清楚了,

如果有不明白的地方, 直接@我就行。

转载请说明出处, 谢谢。

 

 

Thunder

2012/07/01

分享到:
评论
1 楼 tuimaochang 2013-07-27  
你好,这个有完整的源码吗?里面的对话框/图片资源用我自己的看不出效果,还有
((ImageView) preView).setBackgroundResource(img_bg_normal[preIndex]);
这一行提示ImageView cannot be resolved to a type。
我的邮箱lx19990999@sina.com.谢谢博主分享

相关推荐

    Fragment + ViewPager 和 ActivityGroup tab横向滑动实现对比

    下面我们将详细探讨`Fragment + ViewPager`与`ViewPager + ActivityGroup`在实现tab横向滑动时的区别和知识点。 **Fragment + ViewPager** 1. **Fragment的引入**:Fragment是Android 3.0版本引入的概念,它是一个...

    ActivityGroup+GridView实现Tab分页标签的滑动切换界面

    为了实现滑动切换效果,我们可以监听`GridView`的滑动事件,或者使用第三方库如`ViewPager`来更优雅地实现这一功能。`ViewPager`可以自动处理页面间的滑动切换,而且提供了更丰富的页面指示器和动画效果。 总的来说...

    Android Gallery+ActivityGroup实现滑动TAB独立Activity

    "Android Gallery+ActivityGroup实现滑动TAB独立Activity"是一个设计模式,它利用Android的Gallery组件和ActivityGroup来达到这一目的。在这个模式中,每个Tab都对应一个独立的Activity,从而提供更灵活和丰富的用户...

    gridview+activityGroup实现tab分页

    总之,虽然`ActivityGroup`+`GridView`的组合在旧版Android开发中常见,但现代Android开发中,应优先选择`Fragment`和`ViewPager`等组件来实现Tab分页和页面滑动效果。这样不仅代码更简洁,而且能充分利用Android...

    ActivityGroup|顶部底部均有Tab标签之二

    在描述中提到的博客文章中,开发者可能详细介绍了如何将`TabActivity`与`ActivityGroup`结合,以实现在顶部和底部都有Tab的效果。`ActivityGroup`是一个旧的类,用于管理在一个`LocalActivityManager`中的子Activity...

    ActivityGroup和GridView实现标签分页

    6. **顶部Tab实现**: 压缩包中的"ActivityGroup和GridView实现标签分页(顶部Tab)"可能是指在顶部添加一个水平滚动的Tab条,通常使用HorizontalScrollView或ViewPager实现,这种方式可以提供更丰富的交互体验。...

    基于GridView和ActivityGroup实现的TAB分页

    在“基于GridView和ActivityGroup实现的Tab分页”场景下,ViewPager可以替代TabHost,用户可以在水平滑动时平滑地在各个页面之间切换。 6. 文件名“TabActivity”: 这可能是项目中的主Activity文件,负责设置和...

    UI开发第六篇——仿QQ的滑动Tab

    在UI开发中,仿QQ的滑动Tab是一种常见的设计模式,用于实现应用界面中的多页面切换,用户可以通过滑动Tab来...在实际开发中,我们应该采用现代的`Fragment`和`ViewPager`等组件来实现更高效、更可维护的滑动Tab功能。

    仿qq的tab滑动

    在QQ应用中,用户可以通过左右滑动Tab来切换聊天、联系人、发现和我等不同页面。这种设计既节省屏幕空间,又能提供清晰的导航结构。 实现"仿qq的tab滑动"主要有两个关键点:一是视觉上的平滑过渡动画;二是逻辑上的...

    主界面tabhost+activitygroup框架

    - 使用`FragmentTransaction`可以方便地在`Fragment`之间进行切换,而`ViewPager`则可以实现滑动切换的效果,提供更好的用户体验。 总的来说,理解和掌握`TabHost`和`ActivityGroup`有助于了解Android的历史和演进...

    高仿新浪微博tab

    Fragment代表应用程序的一个片段,可以在Activity之间共享,而ViewPager可以滑动展示多个Fragment,实现Tab切换的效果。 对于初学者,理解ActivityGroup的历史背景和工作原理是重要的,因为它可以帮助理解Android的...

    android tab 实现

    在ActivityGroup_Tab中,我们可能看到的是一个自定义的ActivityGroup类,这是早期Android中实现内嵌Activity的方式。ActivityGroup允许我们在一个Activity中启动其他Activity,并在同一个窗口内显示。不过,这种...

    UI开发第六。七。八篇

    尽管在后来的Android版本中,`Fragment`和`ViewPager`成为更推荐的实现方式,但这个例子仍然展示了如何利用`ActivityGroup`来创建类似QQ应用的滑动Tab效果。 代码首先在`onCreate`方法中初始化界面元素,包括各个`...

    自定义Tab选择项卡

    在现代Android开发中,我们通常使用`Fragment`来替代`ActivityGroup`,并结合`ViewPager`实现页面滑动和Tab切换。 总结起来,创建自定义Tab选择项卡涉及Android布局设计、自定义UI组件、事件监听以及页面切换逻辑。...

    安卓ActivityGroup

    `ViewPager`则通过滑动切换页面,为实现复杂的用户界面提供了一种更现代且推荐的方法。 `ActivityGroup`虽然在一些老项目中仍可能被使用,但作为现代Android开发,我们应该尽可能避免使用已被废弃的API。对于混合...

    Android ActivtiyGroup和ViewFlipper实现Activity滑屏切换

    此外,考虑到`ActivityGroup`的过时,可能需要考虑如何用`Fragment`和`ViewPager`等现代组件来实现类似的功能,它们提供了更强大的功能和更好的性能。 总之,`ActivityGroup`和`ViewFlipper`在早期的Android开发中...

    Android应用源码之TabActivityDemo.zip

    在Android开发中,TabActivity是早期版本Android SDK中用于实现底部导航栏的一种方式。这个"TabActivityDemo"是一个示例项目,旨在展示如何在Android应用中创建和使用TabHost组件来构建多标签界面。让我们深入了解...

    ActionBar分页菜单

    `TabHost`在早期版本的Android中常用,但现在已经被`ViewPager`所取代,因为`ViewPager`提供了更流畅的滑动体验和更好的可定制性。在这个案例中,我们将使用`TabHost`来创建分页菜单,因为它与`ActivityGroup`的集成...

    自定义Tabctivity

    在Android应用开发中,`TabActivity`曾是实现底部导航栏的一种常见方式,它允许开发者在同一个Activity中切换多个Fragment或者子Activity来展示不同的内容。然而,随着Android SDK的更新,`TabActivity`已被官方弃用...

    Android项目实战之仿网易顶部导航栏效果

    `Fragment`可以被视为轻量级的`Activity`,可以嵌入到一个更大的UI结构中,而`ViewPager`则负责滑动切换这些`Fragment`。 ```java import android.app.ActivityGroup; import android.app.LocalActivityManager; //...

Global site tag (gtag.js) - Google Analytics