最近闲来无事,在网上寻找源代码看,突然发现了一个国内技术牛人开发的快速开发框架Andbase,花了一天时间研究了下源码和怎么使用,现将开发常见的侧滑栏和滑动标签页组合效果的使用介绍个大家,希望可以减少大家的开发难度

老样子,先上效果图

ok,下面开始介绍如何使用andbase快速开发框架,实现这种常见的界面效果

工程包结构

利用andbase框架开发的一个应用叫做“Android开发宝”,里面的源码详细的介绍了各种效果的使用,功能十分强大,有兴趣的最好可以研究下源码,收获颇丰,由于代码注释很多,我就直接贴代码了

SlidingMenuNestTabActivity.java


package com.example.andbaseexample;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener; import com.ab.activity.AbActivity;
import com.ab.view.slidingmenu.SlidingMenu;
import com.ab.view.titlebar.AbTitleBar; /**
* 碎片的容器,主Activity
*
* @author ZhaoKaiQiang
*
* Time:2014年3月3日
*/
public class SlidingMenuNestTabActivity extends AbActivity { private SlidingMenu menu; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setAbContentView(R.layout.sliding_menu_content); AbTitleBar mAbTitleBar = this.getTitleBar();
mAbTitleBar.setTitleText("侧滑栏");
mAbTitleBar.setLogo(R.drawable.button_selector_back);
mAbTitleBar.setTitleBarBackground(R.drawable.top_bg);
mAbTitleBar.setTitleTextMargin(10, 0, 0, 0);
mAbTitleBar.setLogoLine(R.drawable.line);
mAbTitleBar.getLogoView().setBackgroundResource(
R.drawable.button_selector_menu); // 主视图的Fragment添加
getSupportFragmentManager().beginTransaction()
.replace(R.id.content_frame, new SlidingTabFragment()).commit(); // SlidingMenu的配置
menu = new SlidingMenu(this);
menu.setMode(SlidingMenu.LEFT); // slidingmenu的事件模式,如果里面有可以滑动的请用TOUCHMODE_MARGIN
// 可解决事件冲突问题
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN); menu.setShadowWidthRes(R.dimen.shadow_width);
menu.setShadowDrawable(R.drawable.shadow);
menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
menu.setFadeDegree(0.35f);
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT); // menu视图的Fragment添加
menu.setMenu(R.layout.sliding_menu_menu);
getSupportFragmentManager().beginTransaction()
.replace(R.id.menu_frame, new Fragment1()).commit(); mAbTitleBar.getLogoView().setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
if (menu.isMenuShowing()) {
menu.showContent();
} else {
menu.showMenu();
}
}
});
} @Override
public void onBackPressed() {
if (menu.isMenuShowing()) {
menu.showContent();
} else {
super.onBackPressed();
}
} }

SlidingTabFragment.java

package com.example.andbaseexample;

import java.util.ArrayList;
import java.util.List; import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; import com.ab.view.sliding.AbSlidingTabView;
/**
* 活动标签碎片
* @author ZhaoKaiQiang
*
* Time:2014年3月3日
*/
public class SlidingTabFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.sliding_tab, null);
AbSlidingTabView mAbSlidingTabView = (AbSlidingTabView) view
.findViewById(R.id.mAbSlidingTabView); // 如果里面的页面列表不能下载原因:
// Fragment里面用的AbTaskQueue,由于有多个tab,顺序下载有延迟,还没下载好就被缓存了。改成用AbTaskPool,就ok了。
// 或者setOffscreenPageLimit(0) // 缓存数量
mAbSlidingTabView.getViewPager().setOffscreenPageLimit(5); Fragment1 page1 = new Fragment1();
Fragment1 page2 = new Fragment1();
Fragment1 page3 = new Fragment1();
Fragment1 page4 = new Fragment1();
Fragment1 page5 = new Fragment1(); List<Fragment> mFragments = new ArrayList<Fragment>();
mFragments.add(page1);
mFragments.add(page2);
mFragments.add(page3);
mFragments.add(page4);
mFragments.add(page5); List<String> tabTexts = new ArrayList<String>();
tabTexts.add("推荐");
tabTexts.add("排行");
tabTexts.add("游戏中心");
tabTexts.add("专题栏目");
tabTexts.add("咖啡屋");
// 设置样式
mAbSlidingTabView.setTabTextColor(Color.BLACK);
mAbSlidingTabView.setTabSelectColor(Color.rgb(30, 168, 131));
mAbSlidingTabView.setTabBackgroundResource(R.drawable.tab_bg);
mAbSlidingTabView.setTabLayoutBackgroundResource(R.drawable.slide_top);
// 演示增加一组
mAbSlidingTabView.addItemViews(tabTexts, mFragments); // 演示增加一个
// mAbSlidingTabView.addItemView("咖啡屋", page5); mAbSlidingTabView.setTabPadding(20, 8, 20, 8);
return view;
} public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
} }

ImageListAdapter.java

package com.example.andbaseexample;

import java.util.List;
import java.util.Map; import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView; import com.ab.bitmap.AbImageDownloader;
import com.ab.global.AbConstant;
/**
* 碎片中的图片列表适配器
* @author ZhaoKaiQiang
*
* Time:2014年3月3日
*/
public class ImageListAdapter extends BaseAdapter{ private Context mContext;
//xml转View对象
private LayoutInflater mInflater;
//单行的布局
private int mResource;
//列表展现的数据
private List mData;
//Map中的key
private String[] mFrom;
//view的id
private int[] mTo;
//图片下载器
private AbImageDownloader mAbImageDownloader = null; /**
* 构造方法
* @param context
* @param data 列表展现的数据
* @param resource 单行的布局
* @param from Map中的key
* @param to view的id
*/
public ImageListAdapter(Context context, List data,
int resource, String[] from, int[] to){
this.mContext = context;
this.mData = data;
this.mResource = resource;
this.mFrom = from;
this.mTo = to;
//用于将xml转为View
this.mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//图片下载器
mAbImageDownloader = new AbImageDownloader(mContext);
mAbImageDownloader.setWidth(100);
mAbImageDownloader.setHeight(100);
mAbImageDownloader.setType(AbConstant.SCALEIMG);
mAbImageDownloader.setLoadingImage(R.drawable.image_loading);
mAbImageDownloader.setErrorImage(R.drawable.image_error);
mAbImageDownloader.setNoImage(R.drawable.image_no);
//mAbImageDownloader.setAnimation(true);
} @Override
public int getCount() {
return mData.size();
} @Override
public Object getItem(int position) {
return mData.get(position);
} @Override
public long getItemId(int position){
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent){
final ViewHolder holder;
if(convertView == null){
//使用自定义的list_items作为Layout
convertView = mInflater.inflate(mResource, parent, false);
//减少findView的次数
holder = new ViewHolder();
//初始化布局中的元素
holder.itemsIcon = ((ImageView) convertView.findViewById(mTo[0])) ;
holder.itemsTitle = ((TextView) convertView.findViewById(mTo[1]));
holder.itemsText = ((TextView) convertView.findViewById(mTo[2]));
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
} //获取该行的数据
final Map<String, Object> obj = (Map<String, Object>)mData.get(position);
String imageUrl = (String)obj.get("itemsIcon");
holder.itemsTitle.setText((String)obj.get("itemsTitle"));
holder.itemsText.setText((String)obj.get("itemsText"));
//设置加载中的View
mAbImageDownloader.setLoadingView(convertView.findViewById(R.id.progressBar));
//图片的下载
mAbImageDownloader.display(holder.itemsIcon,imageUrl); return convertView;
} /**
* View元素
*/
static class ViewHolder {
ImageView itemsIcon;
TextView itemsTitle;
TextView itemsText;
ImageButton itemsBtn;
} }

Fragment1.java

package com.example.andbaseexample;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random; import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener; import com.ab.task.AbTaskItem;
import com.ab.task.AbTaskListener;
import com.ab.task.AbTaskQueue;
import com.ab.view.listener.AbOnListViewListener;
import com.ab.view.pullview.AbPullListView; /**
* Activity中嵌入的碎片
* @author ZhaoKaiQiang
*
* Time:2014年3月3日
*/
public class Fragment1 extends Fragment { private Activity mActivity = null;
private List<Map<String, Object>> list = null;
private List<Map<String, Object>> newList = null;
private AbPullListView mAbPullListView = null;
private int currentPage = 1;
private AbTaskQueue mAbTaskQueue = null;
private ArrayList<String> mPhotoList = new ArrayList<String>();
private ImageListAdapter myListViewAdapter = null;
private int total = 50;
private int pageSize = 5; public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mActivity = this.getActivity(); View view = inflater.inflate(R.layout.pull_list, null);
mPhotoList.add("http://img01.taobaocdn.com/bao/uploaded/i3/13215035600700175/T1C2mzXthaXXXXXXXX_!!0-item_pic.jpg_230x230.jpg");
mPhotoList.add("http://img01.taobaocdn.com/bao/uploaded/i2/13215025617307680/T1AQqAXqpeXXXXXXXX_!!0-item_pic.jpg_230x230.jpg");
mPhotoList.add("http://img01.taobaocdn.com/bao/uploaded/i1/13215035569460099/T16GuzXs0cXXXXXXXX_!!0-item_pic.jpg_230x230.jpg");
mPhotoList.add("http://img01.taobaocdn.com/bao/uploaded/i2/13215023694438773/T1lImmXElhXXXXXXXX_!!0-item_pic.jpg_230x230.jpg");
mPhotoList.add("http://img01.taobaocdn.com/bao/uploaded/i3/13215023521330093/T1BWuzXrhcXXXXXXXX_!!0-item_pic.jpg_230x230.jpg");
mPhotoList.add("http://img01.taobaocdn.com/bao/uploaded/i4/13215035563144015/T1Q.eyXsldXXXXXXXX_!!0-item_pic.jpg_230x230.jpg");
mPhotoList.add("http://img01.taobaocdn.com/bao/uploaded/i3/13215023749568975/T1UKWCXvpXXXXXXXXX_!!0-item_pic.jpg_230x230.jpg");
mAbTaskQueue = AbTaskQueue.getInstance();
//获取ListView对象
mAbPullListView = (AbPullListView)view.findViewById(R.id.mListView);
//设置进度条的样式
mAbPullListView.getHeaderView().setHeaderProgressBarDrawable(this.getResources().getDrawable(R.drawable.progress_circular));
mAbPullListView.getFooterView().setFooterProgressBarDrawable(this.getResources().getDrawable(R.drawable.progress_circular));
//ListView数据
list = new ArrayList<Map<String, Object>>(); //使用自定义的Adapter
myListViewAdapter = new ImageListAdapter(mActivity, list,R.layout.list_items,
new String[] { "itemsIcon", "itemsTitle","itemsText" }, new int[] { R.id.itemsIcon,
R.id.itemsTitle,R.id.itemsText });
mAbPullListView.setAdapter(myListViewAdapter);
//item被点击事件
mAbPullListView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
}
}); return view;
} @Override
public void onStart() {
super.onStart();
//定义两种查询的事件
final AbTaskItem item1 = new AbTaskItem();
item1.listener = new AbTaskListener() { @Override
public void update() {
list.clear();
if(newList!=null && newList.size()>0){
list.addAll(newList);
myListViewAdapter.notifyDataSetChanged();
newList.clear();
}
mAbPullListView.stopRefresh();
} @Override
public void get() {
try {
Thread.sleep(1000);
currentPage = 1;
newList = new ArrayList<Map<String, Object>>();
Map<String, Object> map = null; for (int i = 0; i < pageSize; i++) {
map = new HashMap<String, Object>();
map.put("itemsIcon",mPhotoList.get(new Random().nextInt(mPhotoList.size())));
map.put("itemsTitle", "[Fragment1]"+(i+1));
map.put("itemsText", "[Fragment1]..."+(i+1));
newList.add(map);
}
} catch (Exception e) {
}
};
}; final AbTaskItem item2 = new AbTaskItem();
item2.listener = new AbTaskListener() { @Override
public void update() {
if(newList!=null && newList.size()>0){
list.addAll(newList);
myListViewAdapter.notifyDataSetChanged();
newList.clear();
}
mAbPullListView.stopLoadMore();
} @Override
public void get() {
try {
currentPage++;
Thread.sleep(1000);
newList = new ArrayList<Map<String, Object>>();
Map<String, Object> map = null; for (int i = 0; i < pageSize; i++) {
map = new HashMap<String, Object>();
map.put("itemsIcon",mPhotoList.get(new Random().nextInt(mPhotoList.size())));
map.put("itemsTitle", "item上拉"+((currentPage-1)*pageSize+(i+1)));
map.put("itemsText", "item上拉..."+((currentPage-1)*pageSize+(i+1)));
if((list.size()+newList.size()) < total){
newList.add(map);
}
}
} catch (Exception e) {
currentPage--;
newList.clear();
}
};
}; mAbPullListView.setAbOnListViewListener(new AbOnListViewListener(){ @Override
public void onRefresh() {
mAbTaskQueue.execute(item1);
} @Override
public void onLoadMore() {
mAbTaskQueue.execute(item2);
} }); //第一次下载数据
mAbTaskQueue.execute(item1);
} public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
} }

最后给出源代码地址,有问题请留言

点击下载源代码

【Android进阶】使用Andbase快速开发框架实现常见侧滑栏和滑动标签页组合效果的更多相关文章

  1. Android 最火的快速开发框架XUtils

    参考:http://www.oschina.net/p/xutils 项目git地址https://github.com/wyouflf/xUtils 目录(?)[-] 最近搜了一些框架供初学者学习比 ...

  2. 【转】Android 最火的快速开发框架XUtils

    原文:http://blog.csdn.net/rain_butterfly/article/details/37812371 最近搜了一些框架供初学者学习,比较了一下XUtils是目前git上比较活 ...

  3. Android Viewpager+Fragment实现滑动标签页

    ViewPager 结合Fragment实现一个Activity里包含多个可滑动的标签页,每个标签页可以有独立的布局及响应. 主页布局 <?xml version="1.0" ...

  4. Android——使用Toolbar + DrawerLayout快速实现高大上菜单侧滑(转)

    今天就来使用官方支持库来快速实现这类效果,需要使用到Toolbar和DrawerLayout,详细步骤如下:(如果你还不知道这两个Widget,先自己Google吧~) 1.首先需要添加appcomp ...

  5. Android进阶:ListView性能优化异步加载图片 使滑动效果流畅

    ListView 是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很 ...

  6. android的快速开发框架集合

    出自:http://blog.csdn.net/shulianghan/article/details/18046021 1.Afinal  (快速开发框架) 简介:http://www.oschin ...

  7. Android开发面试经——4.常见Android进阶笔试题(更新中...)

      Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...

  8. Android快速开发框架汇总

    知乎贴:Android 开发有什么好的架构么? 里面这篇不错:Architecting Android…The clean way? 知乎贴: 一.如果对App的性能.包size有要求,对代码有洁癖不 ...

  9. AndroidAnnotations(Code Diet)android快速开发框架

    最近用了一款很不错的android快速开发框架,1000行的代码瞬间变成几百行,不用你会后悔的 特点: (1) 依赖注入:包括view,extras,系统服务,资源等等(2) 简单的线程模型,通过an ...

随机推荐

  1. 用Tomcat和Eclipse开发Servlet程序

    1. 安装eclipse 1). 在官网上直接下载Eclipse IDE for Java EE Developers,解压即可: 2. eclipse安装tomcat插件: 1). 在http:// ...

  2. linux下执行strlwr函数出错:ld returned 1 exit status

    执行strlwr函数时报错.源程序例如以下: #include<stdio.h> #include<string.h> void main() { char s[10]={&q ...

  3. Macosx Setdns

    通过C语言接口在Mac App内部对系统的DNS配置进行改动. Mac OS X设置DNS代码 演示样例代码setDNS.c内容例如以下: #include <SystemConfigurati ...

  4. IOS开发笔记 - 基于wsdl2objc调用webservice

    为了方便在ios下调用webserivce,找来了wsdl2objc这样一个开源的框架来解析webservice方便在ios下引用. 下面做个小例子. 1.首先是用Asp.net搭建一个测试的webs ...

  5. java中final的意义

    1.如果一个数据既是static又是final,那么它会拥有一块无法改变的存储空间. 2.final data: 当final用于基本数据类型时,final让其值(value)保持不变,但是当用于ob ...

  6. Multitasking Apps may only use background services for their intended purposes

    2.16 Details Your app declares support for audio in the UIBackgroundModes key in your Info.plist, bu ...

  7. twitter 监测登陆活动

    http://vicenteaguileradiaz.com/download/tinfoleak/tinfoleak-1.2.tar.gz

  8. hdu5338 (二进制,双指针)

    这种双循环的优化问题碰到过很多了.层出不穷. 但无非就是要利用前面循环时,所产生的信息,从而减少计算. 可以注意到log其实是不超过40的, 那么以这方面入手,时间复杂度就可以降为nlogn log= ...

  9. WPF换肤之一:创建圆角窗体

    原文:WPF换肤之一:创建圆角窗体 我们都期望自己的软件能够有一套看上去很吸引人眼球的外衣,使得别人看上去既专业又有美感.这个系列就带领着大家一步一步的讲解如何设计出一套自己的WPF的窗体皮肤,如果文 ...

  10. jQuery的理论基础

    概述 jQuery是用JavaScript语言编写的函数库,我们用时,可以直接调用jQuery中相应的函数,对于JavaScript的理解,前面的博客已经介绍过了,在这里只说一下函数的作用,也可以说为 ...