在写文章来记录自己的学习的时候,没有录制 gif 效果图,感觉整个人都不好了,还好 通过摸索可以在ubuntu 下 制作gif 动态图 ,从而可以分享给大家了;
(1)ViewPage 实现 底部菜单 tab
(2)Fragment 实现 底部菜单 tab
(3)Fragment+ViewPage 实现底部菜单
(4)TabHost 实现 底部菜单 (不推荐)
实现可以点击切换页面 , 滑动切换页面 ;
(1)ViewPage 实现 (2)Fragment实现 (3)ViewPage+Fragment实现
(1)ViewPage实现
(2)Fragment 实现
(3)Fragment+viewpage实现
(4)Tabhost实现
点击打开链接
(1) 实现页面布局
顶部显示 实现:
底部 为 四个 LinearLayout 实现 布局;
使用 include 实现;
(2)实现 业务
1)给Viewpage设置 OnpageChangeListener 的时候 ,也可以使用 SimpleOnPageChangeListener 实现;
2)这里的ViewPage 加载的是 4个布局文件 ,故 在 对 四个布局文件 实现业务交互的时候 需要 在 business 里处理 ,business 是 自己定义的类, 将当前布局的view对象 传入 实现;
package com.example.tabsdemo;
import java.util.ArrayList;
import java.util.List;
import com.example.Business.PageFourBusiness;
import com.example.Business.PageOneBusiness;
import com.example.Business.PageThreeBusiness;
import com.example.Business.PageTwoBusiness;
import com.example.adapter.TabsPageAdapter;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.LinearLayout;
/**
* 使用说明:
* (1) 实现 top.xml
* (2) 实现 buttom.xml
* (3) 实现 Acitvity.xml 页面
* (4) tab 和 ViewPage 业务 在此类 实现
* (5) 子页面 业务实现 在 com.example.Business
* (7) 基本思路
* 通过 ViewPage 实现页面可滑动 和 tab 可以点击切换页面;
* 子页面业务实现 在Business 里 实现 ,通过 子页面的View来操作 该页面业务;
* 当然 也可以在ViewPage 的监听事件里实现 (单独的将 ViewPage的切换页面的监听事件写成一个类实现) ;
*
* @author yuan
*
*/
public class PagerViewTagsActivity extends Activity implements OnClickListener {
private ViewPager vp_tabs;
private LinearLayout linear_shouye, linear_xinxi, linear_wo, linear_gongju;
private ImageButton img_shouye, img_xinxi, img_wo, img_gongju;
private View one_page, two_page, three_page, four_page;
private List views;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pagerview_tabs);
views = new ArrayList();
// 初始化
InitView();
}
private void InitView() {
// 初始化工作
vp_tabs = (ViewPager) findViewById(R.id.vp_tabs);
linear_shouye = (LinearLayout) findViewById(R.id.linear_shouye);
linear_gongju = (LinearLayout) findViewById(R.id.linear_gongju);
linear_wo = (LinearLayout) findViewById(R.id.linner_wo);
linear_xinxi = (LinearLayout) findViewById(R.id.linear_xinxi);
img_gongju = (ImageButton) findViewById(R.id.img_gongju);
img_shouye = (ImageButton) findViewById(R.id.img_shouye);
img_wo = (ImageButton) findViewById(R.id.img_wo);
img_xinxi = (ImageButton) findViewById(R.id.img_xinxi);
// 初始化 view 数据
one_page = View.inflate(this, R.layout.vp_onepage, null);
two_page = View.inflate(this, R.layout.vp_twopage, null);
three_page = View.inflate(this, R.layout.vp_threepage, null);
four_page = View.inflate(this, R.layout.vp_fourpage, null);
views.add(one_page);
views.add(two_page);
views.add(three_page);
views.add(four_page);
// 设置 adapter
TabsPageAdapter pageAdapter = new TabsPageAdapter(views);
vp_tabs.setAdapter(pageAdapter);
// 设置tab 点击事件
linear_gongju.setOnClickListener(this);
linear_shouye.setOnClickListener(this);
linear_wo.setOnClickListener(this);
linear_xinxi.setOnClickListener(this);
//设置ViewPage 切换效果
vp_tabs.setOnPageChangeListener(new vp_tabsOnChangeListener());
//子页面 初始化 工作
InitItemPage();
}
/**
* 初始化
* Item 事件处理
*/
private void InitItemPage() {
//初始化 view Item 中的事件
//第一个页面事件
PageOneBusiness onePageBusiness=new PageOneBusiness(this,one_page);
onePageBusiness.OpBusinessInit();
//第二个页面事件
PageTwoBusiness pageTwoBusiness=new PageTwoBusiness(this,two_page);
pageTwoBusiness.OpBusinessInit();
//第三个页面事件
PageThreeBusiness pageThreeBusiness=new PageThreeBusiness(this,three_page);
pageThreeBusiness.OpBusinessInit();
//第四个页面事件
PageFourBusiness pageFourBusiness=new PageFourBusiness(this,four_page);
pageFourBusiness.OpBusinessInit();
}
/**
* Tags 的 点击事件
*/
@Override
public void onClick(View v) {
// tabs 点击事件
ResetTabsImg();
switch (v.getId()) {
case R.id.linear_shouye:
SetTabsSelectedImg(0);
break;
case R.id.linear_gongju:
SetTabsSelectedImg(2);
break;
case R.id.linner_wo:
SetTabsSelectedImg(3);
break;
case R.id.linear_xinxi:
SetTabsSelectedImg(1);
break;
}
}
/**
* (1)实现选中后的 tabs的img
* (2)切换 viewpager item
* @param i
*/
private void SetTabsSelectedImg(int i) {
switch (i) {
case 0:
img_shouye.setImageResource(R.drawable.ic_menu_deal_on);
break;
case 1:
img_xinxi.setImageResource(R.drawable.ic_menu_more_on);
break;
case 2:
img_gongju.setImageResource(R.drawable.ic_menu_user_on);
break;
case 3:
img_wo.setImageResource(R.drawable.ic_menu_poi_on);
break;
}
//切换 viewpage item
vp_tabs.setCurrentItem(i);
}
/**
* 将 tabs 的 图片设置 默认颜色
*/
private void ResetTabsImg() {
// 重置tab 图片
img_gongju.setImageResource(R.drawable.ic_menu_user_off);
img_shouye.setImageResource(R.drawable.ic_menu_deal_off);
img_wo.setImageResource(R.drawable.ic_menu_poi_off);
img_xinxi.setImageResource(R.drawable.ic_menu_more_off);
}
/**
* ViewPage 切换 监听事件
* @author yuan
*
*/
class vp_tabsOnChangeListener implements OnPageChangeListener{
@Override
public void onPageScrollStateChanged(int arg0) {
//
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int arg0) {
//设置 tab 背景
ResetTabsImg();
SetTabsSelectedImg(arg0);
}
}
}
(3)PageAdapter 实现
package com.example.adapter;
import java.util.List;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
public class TabsPageAdapter extends PagerAdapter {
private List views;
public TabsPageAdapter(List views) {
this.views = views;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(views.get(position));
return views.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(views.get(position));
}
@Override
public int getCount() {
return views.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}
}
http://download.csdn.net/detail/lablenet/9116507
这四种实现方式 ,我推荐实现 Fragment+viewpager实现 ,因为 层次清晰,业务处理方便 ;在Fragment 进行业务逻辑实现 和 Activity 基本一样,同时 Fragment 还有 生命周期 ,方便控制;最后Fragment 方便和 Activity 进行传参交互;