源码:http://pan.baidu.com/s/1DhM14

使用fragment实现的:http://pan.baidu.com/s/1mgzWlM4

SecondActivity.java

 package com.imooc.tab01;

 import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.Toast; public class SecondActivity extends Activity implements OnClickListener{
List<View> mViews = new ArrayList<View>();
PagerAdapter adapter;
ViewPager vp; private ImageButton mWeixinImg;
private ImageButton mFrdImg;
private ImageButton mAddressImg;
private ImageButton mSettingImg; //tabs
private LinearLayout mTabWeixin;
private LinearLayout mTabFrd;
private LinearLayout mTabAddress;
private LinearLayout mTabSetting; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
//LinearLayout,并且设置onClick()监听
mTabWeixin = (LinearLayout) findViewById(R.id.id_tab_weixin2);
mTabFrd = (LinearLayout) findViewById(R.id.id_tab_frd2);
mTabAddress = (LinearLayout) findViewById(R.id.id_tab_address2);
mTabSetting = (LinearLayout) findViewById(R.id.id_tab_settings2);
mTabWeixin.setOnClickListener(this);
mTabFrd.setOnClickListener(this);
mTabAddress.setOnClickListener(this);
mTabSetting.setOnClickListener(this); //ImageButton
mWeixinImg = (ImageButton) findViewById(R.id.id_imgbtn_wx);
mFrdImg = (ImageButton) findViewById(R.id.id_imgbtn_py);
mAddressImg = (ImageButton) findViewById(R.id.id_imgbtn_txl);
mSettingImg = (ImageButton) findViewById(R.id.id_imgbtn_sz);
/*
* 用来把layout布局转换为view对象,并且把view放到List里,这个泛型为View的List在new PagerAdapter的时候,
* 其内部的instantiateItem()方法要用到
*/
LayoutInflater inflater = LayoutInflater.from(this);
View v1 = inflater.inflate(R.layout.tab1, null);
View v2 = inflater.inflate(R.layout.tab2, null);
View v3 = inflater.inflate(R.layout.tab3, null);
View v4 = inflater.inflate(R.layout.tab4, null);
//步骤1
mViews.add(v1);
mViews.add(v2);
mViews.add(v3);
mViews.add(v4);
vp = (ViewPager) findViewById(R.id.id_viewpager2);
//步骤2
adapter = new PagerAdapter() { @Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
View v = mViews.get(position);
container.addView(v);// 一定要把view添加到container中,否则tab中无法显示view
return v;
} @Override
public void destroyItem(ViewGroup container, int position,
Object object) {
container.removeView(mViews.get(position));//从container中移除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();//固定写法
}
};
//步骤3
vp.setAdapter(adapter);
System.out.println("SecondActivity,has already setAdapter..."); //设置Tab滑动的时候的逻辑代码
vp.setOnPageChangeListener(new OnPageChangeListener() {
int current;
@Override
public void onPageSelected(int arg0) {
current = vp.getCurrentItem();//重要的方法,获取当前是哪个tab,
switch (current) {
case 0:
//滑动到第一个tab
resetImg();
//设置微信ImageButton为按下去的效果
mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed);
break;
case 1:
resetImg();
//同上
mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);
break;
case 2:
resetImg();
//同上
mAddressImg.setImageResource(R.drawable.tab_address_pressed);
break;
case 3:
resetImg();
//同上
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
Toast.makeText(SecondActivity.this, "onPageScrolled.......", 0)
.show();
} @Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub }
});
}
//重置所有的ImageButton为灰色
private void resetImg() {
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);
}
/**
* 用来设置ImageButton点击的时候切换到对应的Tab中,
*
*/
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//1 先重置所有ImageButton的背景为灰色
resetImg();
//2
switch (v.getId()) {
//注意,case R.id.id_tab_weixin,这个id不是imageButton的id,而是imageButton的父控件LinearLayout的id
case R.id.id_tab_weixin2:
Toast.makeText(this, "weixin", 0).show();
//设置电机的ImageButton为亮色
mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed);
//设置当前所在的tab
vp.setCurrentItem(0);
break;
case R.id.id_tab_frd2:
mWeixinImg.setImageResource(R.drawable.tab_find_frd_pressed);
vp.setCurrentItem(1);
break;
case R.id.id_tab_address2:
mWeixinImg.setImageResource(R.drawable.tab_address_pressed);
vp.setCurrentItem(2);
break;
case R.id.id_tab_settings2:
mWeixinImg.setImageResource(R.drawable.tab_settings_pressed);
vp.setCurrentItem(3);
break;
default:
break;
}
}
}

ViewPager对应的xml,main2.xml:

 <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/top2" /> <android.support.v4.view.ViewPager
android:id="@+id/id_viewpager2"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
</android.support.v4.view.ViewPager> <include layout="@layout/bottom2" /> </LinearLayout>

效果图如:

ViewPager,模仿慕课网的更多相关文章

  1. 安卓开发_慕课网_Fragment实现Tab(App主界面)

    学习内容来自“慕课网” 这里用Fragment来实现APP主界面 思路: 底部横向排列4个LinearLayout,每个LinearLayout包含一个图片按钮和一个文字 1.默认显示第一个功能(微信 ...

  2. 安卓开发_慕课网_ViewPager与FragmentPagerAdapter实现Tab实现Tab(App主界面)

    学习内容来自“慕课网” ViewPager与FragmentPagerAdapter实现Tab 将这两种实现Tab的方法结合起来.效果就是可以拖动内容区域来改变相应的功能图标亮暗 思路: Fragme ...

  3. 安卓开发_慕课网_ViewPager实现Tab(App主界面)

    学习内容来自“慕课网” 网站上一共有4种方法来实现APP主界面的TAB方法 这里学习第一种 ViewPager实现Tab 布局文件有7个, 主界面acitivity.layout <Linear ...

  4. es6 Object.assign ECMAScript 6 笔记(六) ECMAScript 6 笔记(一) react入门——慕课网笔记 jquery中动态新增的元素节点无法触发事件解决办法 响应式图像 弹窗细节 微信浏览器——返回操作 Float 的那些事 Flex布局 HTML5 data-* 自定义属性 参数传递的四种形式

    es6 Object.assign   目录 一.基本用法 二.用途 1. 为对象添加属性 2. 为对象添加方法 3. 克隆对象 4. 合并多个对象 5. 为属性指定默认值 三.浏览器支持 ES6 O ...

  5. 慕课网-Java入门第一季-7-2 Java 中无参无返回值方法的使用

    来源:http://www.imooc.com/code/1578 如果方法不包含参数,且没有返回值,我们称为无参无返回值的方法. 方法的使用分两步: 第一步,定义方法 例如:下面代码定义了一个方法名 ...

  6. 使用js脚本批量下载慕课网视频

    慕课网(http://www.imooc.com/)上有很多不错的视频,当然我不是来给慕课网打广告的,我本人学习过很多慕课网上的免费的视频. 在线看如果网速慢时,可能会有卡顿,没网时无法观看.所有说下 ...

  7. 手机端web学习基础--from慕课网

    web知识零零散散的知道一些,但总感觉不够系统,遇到问题不知道如何解决,因此特此来系统的学习一下web前端的知识.从慕课网的web基础看起.下面学习http://www.imooc.com/learn ...

  8. 慕课网-安卓工程师初养成-4-9 Java循环语句之 for

    来源:http://www.imooc.com/code/1425 Java 的循环结构中除了 while 和 do...while 外,还有 for 循环,三种循环可以相互替换. 语法: 执行过程: ...

  9. 慕课网-安卓工程师初养成-4-8 Java循环语句之 do...while

    do...while 循环与 while 循环语法有些类似,但执行过程差别比较大. 语法:  执行过程: <1>. 先执行一遍循环操作,然后判断循环条件是否成立 <2>. 如果 ...

随机推荐

  1. HDU 3729 二分匹配 反向匹配

    题意: 给定 n个学生 说的 自己 考试排名的 可能范围 确定最多几个人说真话 如果有多种答案,输出字典序最大的那种( 要求字典序最大,所以solve中从最大字典序开始匹配) 思路: 题目给定  点 ...

  2. [转]IOS 学习笔记(8) 滚动视图(UIScrollView)的使用方法

    下面介绍pageControl结合ScrollView实现连续滑动翻页的效果,ScrollView我们在应用开发中经常用到,以g这种翻页效果还是很好看的,如下图所示: 通过这个例子,我们重点学习UIS ...

  3. Browserify: 使nodejs模块可以在浏览器下使用

    Browserify:浏览器加载Node.js模块--------------------------------------------------随着JavaScript程序逐渐模块化,在ECMA ...

  4. HighCharts学习

    http://www.stepday.com/topic/?369 http://www.helloweba.com/view-blog-156.html

  5. haproxy 超时机制

    <pre name="code" class="python">option redispatch option redispatch 是否允许重新 ...

  6. HDU 3307 Description has only two Sentences

    数学实在是差到不行了…… #include <cstdio> #include <cstring> #include <algorithm> #include &l ...

  7. python Unicode转ascii码的一种方法

    缘起 看到这样的数据:Marek Čech.Beniardá怎样变成相对应的ascii码呢 解决 import unicodedata s = u"Marek Čech" #(u表 ...

  8. Tree(未解决。。。)

    Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  9. block 解析 - 成员变量

    回顾 在 上一篇 中我们讲了截获变量特性,对于局部变量,变量不加__block修饰符,在block内部是无法修改变量的值.而且 对值类型的修改,如果block初始化后,无法同步到block内部 对于指 ...

  10. js 常用的一些函数

    //设置默认焦点    var setFocus = function SetFocus(elementId) {        document.onkeydown = function (even ...