android实现微信tab切换之-ViewPager

ViewPager是我们在android开发中常用的一个组件,今天在本文中我们将用ViewPager实现类似微信的Tab切换这样一个功能,本文只适用于android开发初学者,大牛请绕道,先上图。

      

      

首先要实现以上功能,需要准备一些素材图片,素材图片我们的源码中有。

要实现如上图所示的效果,我们需要对整个界面布局,那么在上图中,页面可以分成三个部分top,content,bottom三个部分,那么在content中,因为我们使用的是viewpager组建,所以我们需要设计四个不同的布局文件,那么要实现整个页面的效果,我们总共需要7个布局文件顶部布局文件top.xml、底部tab布局文件bottom.xml、微信tab内容布局文件weixin.xml、朋友tab内容布局文件frd.xml、通讯录内容布局文件address.xml、设置tab内容布局文件setting.xml、启动页面布局文件activity_main.xml.

至于页面怎么布局,我们这里就不细细的再去讲了,在本文的地段现在源码,在源码里面都有。这里主要分析怎么通过ViewPager实现如图所示的功能。

 1、声明页面中的元素

private ViewPager mViewPager;
private PagerAdapter mAdapter;
private List<View> mViews = new ArrayList<View>();

private LinearLayout mTabWeiXin;
private LinearLayout mTabFrd;
private LinearLayout mTabAddress;
private LinearLayout mTabSetting;

private ImageButton mWeiXinImg;
private ImageButton mFrdImg;
private ImageButton mAddressImg;
private ImageButton mSettingImg;

  基于ViewPager实现tab切换,需要为ViewPager对象设置页面的适配器,所以我们需要mAdapter作为ViewPager的数据适配器,数据适配器需要有数据源,所以我们也需要声明一个View类型的List作为mAdapter的数据源。

 2、元素初始化

在讲解初始化元素之前,我们先分析一下主布局文件的代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <include layout="@layout/top" />

    <android.support.v4.view.ViewPager
        android:id="@+id/id_viewPager"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        ></android.support.v4.view.ViewPager>

    <include layout="@layout/bottom" />

</LinearLayout>

  在主页面中,首先我们需要通过include标记将top和bottom两个布局导入到页面中,中间内容的切换基于ViewPager实现,这里需要注意一点就是ViewPager是在v4包中,所以在布局时需要指定ViewPager所在的包。

按照常规的方式,我们先对页面的元素进行初始化

mViewPager = (ViewPager) findViewById(R.id.id_viewPager);

//tabs
mTabWeiXin = (LinearLayout) findViewById(R.id.id_WeiXin);
mTabFrd = (LinearLayout) findViewById(R.id.Tab_id_Frd);
mTabAddress = (LinearLayout) findViewById(R.id.id_Adrress);
mTabSetting = (LinearLayout) findViewById(R.id.id_Setting);

//ImageButton
mWeiXinImg = (ImageButton) findViewById(R.id.id_WeiXin_Img);
mFrdImg = (ImageButton) findViewById(R.id.id_Frd_Img);
mAddressImg = (ImageButton) findViewById(R.id.id_Adrress_Img);
mSettingImg = (ImageButton) findViewById(R.id.id_Setting_Img);

  通过初始化得到ViewPager元素,tab元素质之后,我们需要为mViewPager添加适配器,添加适配器之前需要准备数据源,初始化mAdapter。

LayoutInflater mInflater = LayoutInflater.from(this);
View weixinTabView = mInflater.inflate(R.layout.weixin, null);
View frdTabView = mInflater.inflate(R.layout.frd, null);
View settingTabView = mInflater.inflate(R.layout.setting, null);
View addressTabView = mInflater.inflate(R.layout.address, null);

mViews.add(weixinTabView);
mViews.add(frdTabView);
mViews.add(addressTabView);
mViews.add(settingTabView);

mAdapter = new PagerAdapter() {

	@Override
	public void destroyItem(ViewGroup container, int position,Object object) {
		// TODO Auto-generated method stub
		container.removeView(mViews.get(position));
	}

	@Override
	public Object instantiateItem(ViewGroup container, int position) {
		// TODO Auto-generated method stub
		View view = mViews.get(position);
		container.addView(view);
		return view;
	}

	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		// TODO Auto-generated method stub
		return arg0==arg1;
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return mViews.size();
	}
};
mViewPager.setAdapter(mAdapter);

  

3、事件处理

页面中设计到的时间主要包括tab的点击事件和ViewPager的滑动事件,在本示例中为了代码的简洁,我们让MainActivity实现OnClickListener接口来实现点击事件。

实现OnClickListener接口需要实现onClick方法。

tab点击时,为了实现被点击tab高亮,其他tab变暗,那么首先电泳ResetImg()方法将所有图片tab设置变暗,然后再根据所点击的tab实现页面切换和tab的点亮。

public void onClick(View v) {
		// TODO Auto-generated method stub
		ResetImg();

		switch (v.getId()) {
		case R.id.id_WeiXin:
			mViewPager.setCurrentItem(0);
			mWeiXinImg.setImageResource(R.drawable.tab_weixin_pressed);
			break;

		case R.id.Tab_id_Frd:
			mViewPager.setCurrentItem(1);
			mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);
			break;

		case R.id.id_Adrress:
			mViewPager.setCurrentItem(2);
			mAddressImg.setImageResource(R.drawable.tab_address_pressed);
			break;

		case R.id.id_Setting:
			mViewPager.setCurrentItem(3);
			mSettingImg.setImageResource(R.drawable.tab_settings_pressed);
			break;

		default:
			break;
		}
	}

  

private void ResetImg() {
		// TODO Auto-generated method stub
		mWeiXinImg.setImageResource(R.drawable.tab_weixin_normal);
		mFrdImg.setImageResource(R.drawable.tab_find_frd_normal);
		mAddressImg.setImageResource(R.drawable.tab_address_normal);
		mSettingImg.setImageResource(R.drawable.tab_settings_normal);
	}

 在我们滑动页面时,ViewPager切换的同时,tab也要跟着切换,所以我们还需要对ViewPager切换事件进行处理。

//view发生变化
		mViewPager.setOnPageChangeListener(new OnPageChangeListener() {

			@Override
			public void onPageSelected(int arg0) {
				// TODO Auto-generated method stub
				int currentItem = mViewPager.getCurrentItem();
				ResetImg();
				switch (currentItem) {
				case 0:
					mWeiXinImg.setImageResource(R.drawable.tab_weixin_pressed);
					break;

				case 1:
					mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);
					break;

				case 2:
					mAddressImg.setImageResource(R.drawable.tab_address_pressed);
					break;

				case 3:
					mSettingImg.setImageResource(R.drawable.tab_settings_pressed);
					break;

				default:
					break;
				}
			}

			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onPageScrollStateChanged(int arg0) {
				// TODO Auto-generated method stub

			}
		});

  

源码下载: ViewPager.rar

时间: 2024-11-09 23:12:08

android实现微信tab切换之-ViewPager的相关文章

Android底部Tab页基于ViewPager的实现

在众多主流App中,包括QQ,微信等,为了和ios的UI保持统一,很多App使用的都是底部导航,当然在Android中也并不反对这种设计.这篇文章使用ViewPager实现这种效果.首先看实现效果图吧.效果图中包含了ViewPager的嵌套. 在讨论实现之前,我们先来回忆一下,之前我们是如何实现的. 之前的实现方法,我们无法是先进行布局,再编写逻辑.而布局,底部有一定高度的Tab,一般由4个或者5个,也有3个的,具体视应用而定,而Tab上方则是一个FrameLayout,用于作为fragment

Android典型界面设计-访网易新闻实现双导航tab切换

一.问题描述 双导航tab切换(底部区块+区域内头部导航),实现方案底部区域使用FragmentTabHost+Fragment, 区域内头部导航使用ViewPager+Fragment,可在之前博客Android典型界面设计2(FragmentTabHost+Fragment实现底部tab切换)基础之上和Android典型界面设计1(ViewPage+Fragment实现区域顶部tab滑动切换)整合应用实现.查看两篇博客请点击:http://www.cnblogs.com/jerehedu/p

Android编程心得-使用ActionBar+Fragment+ViewPager实现动态切换Menu效果

1.首先上效果图 2.本例实现的效果主要适用于当前页面有多个页签时.进行Fragment切换时,能够利用不同的Menu样式与当前Fragment中的内容进行配合,能够大大添加复用性,看到效果图后,以下我来介绍我实现这一效果的主要步骤 2.1  由于此处我有3个样式,那么我须要在res/menu 目录下创建三个文件,style1.xml,style2.xml,style3.xml.这里我以style1.xml为例.详细的文字图标文件可依照需求,style2.xml,style3.xml类似. st

Android防微信首页左右滑动切换

大家看到微信首页切换效果有没有觉得很炫,滑动切换,点击底部bar瞬间切换,滑动切换渐变效果,线上效果图: 之前也在博客上看到别人的实现,再次基础上,我做了些优化.首先说下实现原理,大神略过,o(╯□╰)o 页面上看到的三个页面是三个Fragment, 左右滑动使用viewpager,相信大家也都是这么再用,那么底部用的是什么技术呢,底部渐变其实就是重写了ImageView,以及在左右滑动时,改变了TextView的颜色值,是不是很简单...下面我们一步一步的来: 1.自定义ImageView:

Android之仿微信Tab滑动

这个项目实现了以下的功能:有三个标签聊天.发现和通讯录,左右滑动下面的ViewPager可以切换不同的标签,且标签下面的蓝色条可以随着手指的滑动来实时滑动.另外,如果第二次滑动到“聊天”界面,可以在“聊天”旁边添加一个“七条信息”的BadgeView.具体的运行效果如下.   下面上代码.顺便说一下,使用BadgeView的话,我们需要导入它的JAR包,点击这里下载. 1 <?xml version="1.0" encoding="utf-8"?> 2

Android典型界面设计(3)——访网易新闻实现双导航tab切换

一.问题描述 双导航tab切换(底部区块+区域内头部导航),实现方案底部区域使用FragmentTabHost+Fragment, 区域内头部导航使用ViewPager+Fragment,可在之前博客Android典型界面设计2(FragmentTabHost+Fragment实现底部tab切换)基础之上和Android典型界面设计1(ViewPage+Fragment实现区域顶部tab滑动切换)整合应用实现.查看两篇博客请点击:http://www.cnblogs.com/jerehedu/p

微信Tab页切换

参考开源项目PagerSlidingTabStrip 做了一些小修改,比如设置Tab页平均铺满效果.字体变色等 微调的代码请 源码 下载 关于我 private void addTab(final int position, View tab) { tab.setFocusable(true); tab.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { pager.setCurre

FragmentPagerAdapter+ViewPager实现Tab切换效果

1.Activity  加载布局文件,获取Viewpager控件   给ViewPager填充适配器. import android.app.ActionBar; import android.app.ActionBar.Tab; import android.app.Activity; import android.app.Fragment; import android.app.FragmentTransaction; import android.content.Context; impo

【原创】android——Tabhost 自定义tab+底部实现+intent切换内容

1,实现tabhost自定义格式,再此仅仅显示背景和文字,效果图预览:(底边栏所示) (图片变形) 2,xml配置 activity_user的XML配置  1 <TabHost xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:id="@+id/tabhost&qu