最近闲来无事,在网上寻找源代码看,突然发现了一个国内技术牛人开发的快速开发框架Andbase,花了一天时间研究了下源码和怎么使用,现将开发常见的侧滑栏和滑动标签页组合效果的使用介绍个大家,希望可以减少大家的开发难度
老样子,先上效果图
ok,下面开始介绍如何使用andbase快速开发框架,实现这种常见的界面效果
工程包结构
利用andbase框架开发的一个应用叫做“Android开发宝”,里面的源码详细的介绍了各种效果的使用,功能十分强大,有兴趣的最好可以研究下源码,收获颇丰,由于代码注释很多,我就直接贴代码了
SlidingMenuNestTabActivity.java
1.
01.
package
com.example.andbaseexample;
02.
03.
import
android.os.Bundle;
04.
import
android.view.View;
05.
import
android.view.View.OnClickListener;
06.
07.
import
com.ab.activity.AbActivity;
08.
import
com.ab.view.slidingmenu.SlidingMenu;
09.
import
com.ab.view.titlebar.AbTitleBar;
10.
11.
/**
12.
* 碎片的容器,主Activity
13.
*
14.
* @author ZhaoKaiQiang
15.
*
16.
* Time:2014年3月3日
17.
*/
18.
public
class
SlidingMenuNestTabActivity
extends
AbActivity {
19.
20.
private
SlidingMenu menu;
21.
22.
@Override
23.
public
void
onCreate(Bundle savedInstanceState) {
24.
super
.onCreate(savedInstanceState);
25.
setAbContentView(R.layout.sliding_menu_content);
26.
27.
AbTitleBar mAbTitleBar =
this
.getTitleBar();
28.
mAbTitleBar.setTitleText(
"侧滑栏"
);
29.
mAbTitleBar.setLogo(R.drawable.button_selector_back);
30.
mAbTitleBar.setTitleBarBackground(R.drawable.top_bg);
31.
mAbTitleBar.setTitleTextMargin(
10
,
0
,
0
,
0
);
32.
mAbTitleBar.setLogoLine(R.drawable.line);
33.
mAbTitleBar.getLogoView().setBackgroundResource(
34.
R.drawable.button_selector_menu);
35.
36.
// 主视图的Fragment添加
37.
getSupportFragmentManager().beginTransaction()
38.
.replace(R.id.content_frame,
new
SlidingTabFragment()).commit();
39.
40.
// SlidingMenu的配置
41.
menu =
new
SlidingMenu(
this
);
42.
menu.setMode(SlidingMenu.LEFT);
43.
44.
// slidingmenu的事件模式,如果里面有可以滑动的请用TOUCHMODE_MARGIN
45.
// 可解决事件冲突问题
46.
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
47.
48.
menu.setShadowWidthRes(R.dimen.shadow_width);
49.
menu.setShadowDrawable(R.drawable.shadow);
50.
menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
51.
menu.setFadeDegree(
0
.35f);
52.
menu.attachToActivity(
this
, SlidingMenu.SLIDING_CONTENT);
53.
54.
// menu视图的Fragment添加
55.
menu.setMenu(R.layout.sliding_menu_menu);
56.
getSupportFragmentManager().beginTransaction()
57.
.replace(R.id.menu_frame,
new
Fragment1()).commit();
58.
59.
mAbTitleBar.getLogoView().setOnClickListener(
new
OnClickListener() {
60.
61.
@Override
62.
public
void
onClick(View arg0) {
63.
if
(menu.isMenuShowing()) {
64.
menu.showContent();
65.
}
else
{
66.
menu.showMenu();
67.
}
68.
}
69.
});
70.
}
71.
72.
@Override
73.
public
void
onBackPressed() {
74.
if
(menu.isMenuShowing()) {
75.
menu.showContent();
76.
}
else
{
77.
super
.onBackPressed();
78.
}
79.
}
80.
81.
}
SlidingTabFragment.java
01.
package
com.example.andbaseexample;
02.
03.
import
java.util.ArrayList;
04.
import
java.util.List;
05.
06.
import
android.graphics.Color;
07.
import
android.os.Bundle;
08.
import
android.support.v4.app.Fragment;
09.
import
android.view.LayoutInflater;
10.
import
android.view.View;
11.
import
android.view.ViewGroup;
12.
13.
import
com.ab.view.sliding.AbSlidingTabView;
14.
/**
15.
* 活动标签碎片
16.
* @author ZhaoKaiQiang
17.
*
18.
* Time:2014年3月3日
19.
*/
20.
public
class
SlidingTabFragment
extends
Fragment {
21.
22.
public
View onCreateView(LayoutInflater inflater, ViewGroup container,
23.
Bundle savedInstanceState) {
24.
View view = inflater.inflate(R.layout.sliding_tab,
null
);
25.
AbSlidingTabView mAbSlidingTabView = (AbSlidingTabView) view
26.
.findViewById(R.id.mAbSlidingTabView);
27.
28.
// 如果里面的页面列表不能下载原因:
29.
// Fragment里面用的AbTaskQueue,由于有多个tab,顺序下载有延迟,还没下载好就被缓存了。改成用AbTaskPool,就ok了。
30.
// 或者setOffscreenPageLimit(0)
31.
32.
// 缓存数量
33.
mAbSlidingTabView.getViewPager().setOffscreenPageLimit(
5
);
34.
35.
Fragment1 page1 =
new
Fragment1();
36.
Fragment1 page2 =
new
Fragment1();
37.
Fragment1 page3 =
new
Fragment1();
38.
Fragment1 page4 =
new
Fragment1();
39.
Fragment1 page5 =
new
Fragment1();
40.
41.
List<Fragment> mFragments =
new
ArrayList<Fragment>();
42.
mFragments.add(page1);
43.
mFragments.add(page2);
44.
mFragments.add(page3);
45.
mFragments.add(page4);
46.
mFragments.add(page5);
47.
48.
List<String> tabTexts =
new
ArrayList<String>();
49.
tabTexts.add(
"推荐"
);
50.
tabTexts.add(
"排行"
);
51.
tabTexts.add(
"游戏中心"
);
52.
tabTexts.add(
"专题栏目"
);
53.
tabTexts.add(
"咖啡屋"
);
54.
// 设置样式
55.
mAbSlidingTabView.setTabTextColor(Color.BLACK);
56.
mAbSlidingTabView.setTabSelectColor(Color.rgb(
30
,
168
,
131
));
57.
mAbSlidingTabView.setTabBackgroundResource(R.drawable.tab_bg);
58.
mAbSlidingTabView.setTabLayoutBackgroundResource(R.drawable.slide_top);
59.
// 演示增加一组
60.
mAbSlidingTabView.addItemViews(tabTexts, mFragments);
61.
62.
// 演示增加一个
63.
// mAbSlidingTabView.addItemView("咖啡屋", page5);
64.
65.
mAbSlidingTabView.setTabPadding(
20
,
8
,
20
,
8
);
66.
return
view;
67.
}
68.
69.
public
void
onActivityCreated(Bundle savedInstanceState) {
70.
super
.onActivityCreated(savedInstanceState);
71.
}
72.
73.
}
ImageListAdapter.java
001.
package
com.example.andbaseexample;
002.
003.
import
java.util.List;
004.
import
java.util.Map;
005.
006.
import
android.content.Context;
007.
import
android.view.LayoutInflater;
008.
import
android.view.View;
009.
import
android.view.ViewGroup;
010.
import
android.widget.BaseAdapter;
011.
import
android.widget.ImageButton;
012.
import
android.widget.ImageView;
013.
import
android.widget.TextView;
014.
015.
import
com.ab.bitmap.AbImageDownloader;
016.
import
com.ab.global.AbConstant;
017.
/**
018.
* 碎片中的图片列表适配器
019.
* @author ZhaoKaiQiang
020.
*
021.
* Time:2014年3月3日
022.
*/
023.
public
class
ImageListAdapter
extends
BaseAdapter{
024.
025.
026.
private
Context mContext;
027.
//xml转View对象
028.
private
LayoutInflater mInflater;
029.
//单行的布局
030.
private
int
mResource;
031.
//列表展现的数据
032.
private
List mData;
033.
//Map中的key
034.
private
String[] mFrom;
035.
//view的id
036.
private
int
[] mTo;
037.
//图片下载器
038.
private
AbImageDownloader mAbImageDownloader =
null
;
039.
040.
/**
041.
* 构造方法
042.
* @param context
043.
* @param data 列表展现的数据
044.
* @param resource 单行的布局
045.
* @param from Map中的key
046.
* @param to view的id
047.
*/
048.
public
ImageListAdapter(Context context, List data,
049.
int
resource, String[] from,
int
[] to){
050.
this
.mContext = context;
051.
this
.mData = data;
052.
this
.mResource = resource;
053.
this
.mFrom = from;
054.
this
.mTo = to;
055.
//用于将xml转为View
056.
this
.mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
057.
//图片下载器
058.
mAbImageDownloader =
new
AbImageDownloader(mContext);
059.
mAbImageDownloader.setWidth(
100
);
060.
mAbImageDownloader.setHeight(
100
);
061.
mAbImageDownloader.setType(AbConstant.SCALEIMG);
062.
mAbImageDownloader.setLoadingImage(R.drawable.image_loading);
063.
mAbImageDownloader.setErrorImage(R.drawable.image_error);
064.
mAbImageDownloader.setNoImage(R.drawable.image_no);
065.
//mAbImageDownloader.setAnimation(true);
066.
}
067.
068.
@Override
069.
public
int
getCount() {
070.
return
mData.size();
071.
}
072.
073.
@Override
074.
public
Object getItem(
int
position) {
075.
return
mData.get(position);
076.
}
077.
078.
@Override
079.
public
long
getItemId(
int
position){
080.
return
position;
081.
}
082.
083.
@Override
084.
public
View getView(
int
position, View convertView, ViewGroup parent){
085.
final
ViewHolder holder;
086.
if
(convertView ==
null
){
087.
//使用自定义的list_items作为Layout
088.
convertView = mInflater.inflate(mResource, parent,
false
);
089.
//减少findView的次数
090.
holder =
new
ViewHolder();
091.
//初始化布局中的元素
092.
holder.itemsIcon = ((ImageView) convertView.findViewById(mTo[
0
])) ;
093.
holder.itemsTitle = ((TextView) convertView.findViewById(mTo[
1
]));
094.
holder.itemsText = ((TextView) convertView.findViewById(mTo[
2
]));
095.
convertView.setTag(holder);
096.
}
else
{
097.
holder = (ViewHolder) convertView.getTag();
098.
}
099.
100.
//获取该行的数据
101.
final
Map<String, Object> obj = (Map<String, Object>)mData.get(position);
102.
String imageUrl = (String)obj.get(
"itemsIcon"
);
103.
holder.itemsTitle.setText((String)obj.get(
"itemsTitle"
));
104.
holder.itemsText.setText((String)obj.get(
"itemsText"
));
105.
//设置加载中的View
106.
mAbImageDownloader.setLoadingView(convertView.findViewById(R.id.progressBar));
107.
//图片的下载
108.
mAbImageDownloader.display(holder.itemsIcon,imageUrl);
109.
110.
return
convertView;
111.
}
112.
113.
/**
114.
* View元素
115.
*/
116.
static
class
ViewHolder {
117.
ImageView itemsIcon;
118.
TextView itemsTitle;
119.
TextView itemsText;
120.
ImageButton itemsBtn;
121.
}
122.
123.
}
Fragment1.java
001.
package
com.example.andbaseexample;
002.
003.
import
java.util.ArrayList;
004.
import
java.util.HashMap;
005.
import
java.util.List;
006.
import
java.util.Map;
007.
import
java.util.Random;
008.
009.
import
android.app.Activity;
010.
import
android.os.Bundle;
011.
import
android.support.v4.app.Fragment;
012.
import
android.view.LayoutInflater;
013.
import
android.view.View;
014.
import
android.view.ViewGroup;
015.
import
android.widget.AdapterView;
016.
import
android.widget.AdapterView.OnItemClickListener;
017.
018.
import
com.ab.task.AbTaskItem;
019.
import
com.ab.task.AbTaskListener;
020.
import
com.ab.task.AbTaskQueue;
021.
import
com.ab.view.listener.AbOnListViewListener;
022.
import
com.ab.view.pullview.AbPullListView;
023.
024.
/**
025.
* Activity中嵌入的碎片
026.
* @author ZhaoKaiQiang
027.
*
028.
* Time:2014年3月3日
029.
*/
030.
public
class
Fragment1
extends
Fragment {
031.
032.
private
Activity mActivity =
null
;
033.
private
List<Map<String, Object>> list =
null
;
034.
private
List<Map<String, Object>> newList =
null
;
035.
private
AbPullListView mAbPullListView =
null
;
036.
private
int
currentPage =
1
;
037.
private
AbTaskQueue mAbTaskQueue =
null
;
038.
private
ArrayList<String> mPhotoList =
new
ArrayList<String>();
039.
private
ImageListAdapter myListViewAdapter =
null
;
040.
private
int
total =
50
;
041.
private
int
pageSize =
5
;
042.
043.
public
View onCreateView(LayoutInflater inflater, ViewGroup container,
044.
Bundle savedInstanceState) {
045.
mActivity =
this
.getActivity();
046.
047.
View view = inflater.inflate(R.layout.pull_list,
null
);
048.
mPhotoList.add(
"http://img01.taobaocdn.com/bao/uploaded/i3/13215035600700175/T1C2mzXthaXXXXXXXX_!!0-item_pic.jpg_230x230.jpg"
);
049.
mPhotoList.add(
"http://img01.taobaocdn.com/bao/uploaded/i2/13215025617307680/T1AQqAXqpeXXXXXXXX_!!0-item_pic.jpg_230x230.jpg"
);
050.
mPhotoList.add(
"http://img01.taobaocdn.com/bao/uploaded/i1/13215035569460099/T16GuzXs0cXXXXXXXX_!!0-item_pic.jpg_230x230.jpg"
);
051.
mPhotoList.add(
"http://img01.taobaocdn.com/bao/uploaded/i2/13215023694438773/T1lImmXElhXXXXXXXX_!!0-item_pic.jpg_230x230.jpg"
);
052.
mPhotoList.add(
"http://img01.taobaocdn.com/bao/uploaded/i3/13215023521330093/T1BWuzXrhcXXXXXXXX_!!0-item_pic.jpg_230x230.jpg"
);
053.
mPhotoList.add(
"http://img01.taobaocdn.com/bao/uploaded/i4/13215035563144015/T1Q.eyXsldXXXXXXXX_!!0-item_pic.jpg_230x230.jpg"
);
054.
mPhotoList.add(
"http://img01.taobaocdn.com/bao/uploaded/i3/13215023749568975/T1UKWCXvpXXXXXXXXX_!!0-item_pic.jpg_230x230.jpg"
);
055.
mAbTaskQueue = AbTaskQueue.getInstance();
056.
//获取ListView对象
057.
mAbPullListView = (AbPullListView)view.findViewById(R.id.mListView);
058.
//设置进度条的样式
059.
mAbPullListView.getHeaderView().setHeaderProgressBarDrawable(
this
.getResources().getDrawable(R.drawable.progress_circular));
060.
mAbPullListView.getFooterView().setFooterProgressBarDrawable(
this
.getResources().getDrawable(R.drawable.progress_circular));
061.
//ListView数据
062.
list =
new
ArrayList<Map<String, Object>>();
063.
064.
//使用自定义的Adapter
065.
myListViewAdapter =
new
ImageListAdapter(mActivity, list,R.layout.list_items,
066.
new
String[] {
"itemsIcon"
,
"itemsTitle"
,
"itemsText"
},
new
int
[] { R.id.itemsIcon,
067.
R.id.itemsTitle,R.id.itemsText });
068.
mAbPullListView.setAdapter(myListViewAdapter);
069.
//item被点击事件
070.
mAbPullListView.setOnItemClickListener(
new
OnItemClickListener(){
071.
@Override
072.
public
void
onItemClick(AdapterView<?> parent, View view,
073.
int
position,
long
id) {
074.
}
075.
});
076.
077.
return
view;
078.
}
079.
080.
081.
082.
@Override
083.
public
void
onStart() {
084.
super
.onStart();
085.
//定义两种查询的事件
086.
final
AbTaskItem item1 =
new
AbTaskItem();
087.
item1.listener =
new
AbTaskListener() {
088.
089.
@Override
090.
public
void
update() {
091.
list.clear();
092.
if
(newList!=
null
&& newList.size()>
0
){
093.
list.addAll(newList);
094.
myListViewAdapter.notifyDataSetChanged();
095.
newList.clear();
096.
}
097.
mAbPullListView.stopRefresh();
098.
}
099.
100.
@Override
101.
public
void
get() {
102.
try
{
103.
Thread.sleep(
1000
);
104.
currentPage =
1
;
105.
newList =
new
ArrayList<Map<String, Object>>();
106.
Map<String, Object> map =
null
;
107.
108.
for
(
int
i =
0
; i < pageSize; i++) {
109.
map =
new
HashMap<String, Object>();
110.
map.put(
"itemsIcon"
,mPhotoList.get(
new
Random().nextInt(mPhotoList.size())));
111.
map.put(
"itemsTitle"
,
"[Fragment1]"
+(i+
1
));
112.
map.put(
"itemsText"
,
"[Fragment1]..."
+(i+
1
));
113.
newList.add(map);
114.
}
115.
}
catch
(Exception e) {
116.
}
117.
};
118.
};
119.
120.
final
AbTaskItem item2 =
new
AbTaskItem();
121.
item2.listener =
new
AbTaskListener() {
122.
123.
@Override
124.
public
void
update() {
125.
if
(newList!=
null
&& newList.size()>
0
){
126.
list.addAll(newList);
127.
myListViewAdapter.notifyDataSetChanged();
128.
newList.clear();
129.
}
130.
mAbPullListView.stopLoadMore();
131.
}
132.
133.
@Override
134.
public
void
get() {
135.
try
{
136.
currentPage++;
137.
Thread.sleep(
1000
);
138.
newList =
new
ArrayList<Map<String, Object>>();
139.
Map<String, Object> map =
null
;
140.
141.
for
(
int
i =
0
; i < pageSize; i++) {
142.
map =
new
HashMap<String, Object>();
143.
map.put(
"itemsIcon"
,mPhotoList.get(
new
Random().nextInt(mPhotoList.size())));
144.
map.put(
"itemsTitle"
,
"item上拉"
+((currentPage-
1
)*pageSize+(i+
1
)));
145.
map.put(
"itemsText"
,
"item上拉..."
+((currentPage-
1
)*pageSize+(i+
1
)));
146.
if
((list.size()+newList.size()) < total){
147.
newList.add(map);
148.
}
149.
}
150.
}
catch
(Exception e) {
151.
currentPage--;
152.
newList.clear();
153.
}
154.
};
155.
};
156.
157.
mAbPullListView.setAbOnListViewListener(
new
AbOnListViewListener(){
158.
159.
@Override
160.
public
void
onRefresh() {
161.
mAbTaskQueue.execute(item1);
162.
}
163.
164.
@Override
165.
public
void
onLoadMore() {
166.
mAbTaskQueue.execute(item2);
167.
}
168.
169.
});
170.
171.
//第一次下载数据
172.
mAbTaskQueue.execute(item1);
173.
}
174.
175.
176.
177.
public
void
onActivityCreated(Bundle savedInstanceState) {
178.
super
.onActivityCreated(savedInstanceState);
179.
}
180.
181.
}
最后给出源代码地址,有问题请留言
下载源代码 http://yun.baidu.com/share/link?shareid=1655676811&uk=2805318064