0%

StackView是Android 3.0新增的控件,可以实现多个View在竖直方向堆叠摆放。属于AdapterView的一个子类,本人觉得没有多大用处,其一堆叠的距离和方向不能控制;其二动画设置也不起作用,也可能是由于本人研究不够仔细吧,望知情者予以告知。

阅读全文 »

水平广告轮播一般使用ViewPager,其实用ViewFlipper也可以,最近有需求要实现一个竖起方向的公告轮播,像美团,淘宝首页这样公告轮播。这时用ViewPager就办不到了,ViewFlipper就派上用场了。

阅读全文 »

xUtils简介

Github上比较火的一个安卓快速开发库.

下载地址

xUtils 包含了很多实用的android工具。

xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响…

xUitls 最低兼容android 2.2 (api level 8)

注解开发方式–ViewUtils

完全注解方式就可以进行UI绑定和事件绑定。
无需findViewById和setClickListener等。

重要对象

注解 对类 方法 变量 以 添加注解以后由注解处理器处理该注解 开发效率高
@ViewInject 对控件变量设置指定id实例代替findViewById
@OnClick 对控件添加事件代替setOn…Listener支持常见事件
@ResInject 对数据变量设置值代替getResource().getString(R.string.app_name)
ViewsUtils 使注解生效Activity– ViewsUtils.inject(this),Fragment –ViewUtils.inject(this,view)

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class FirstMainActivity extends Activity {

@ViewInject(R.id.mybutton)

Button mybutton;

@OnClick(R.id.mybutton)

public void myButonClick(View view) {

Toast.makeText(getBaseContext(), "点了我", 0).show();

}

@ResInject(id = R.string.app_name, type = ResType.String)

String text;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ViewUtils.inject(this);

System.out.println(mybutton);

mybutton.setText(text);

// mybutton.setOnClickListener(new OnClickListener() {

// @Override

// public void onClick(View v) {

// Toast.makeText(getBaseContext(), "点了我", 0).show();

//

// }

// });

}



}

网络开发工具–HttpUtils

这里写图片描述

重要对象

HttpUtils 发送请求的对象get/post/download/强大的地方:支持文件下载中断后,在原来位置重新下载
RequestCallBack 响应数据的接收类;通过对应方法接收返回数据;onSuccess成功, onFailure失败。。。

get

  • 配置权限

  • 创建HttpUtils实例

  • 发送请求

  • 接收数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@OnClick(R.id.get)

public void get(View view) {

try {

String url = "https://www.baidu.com/";

// ① 配置权限

// ② 创建HttpUtils实例

HttpUtils http = new HttpUtils() ;

// ③ 发送请求

// http.send(请求方法, 网络地址, 数据接收对象);

http.send(HttpMethod.GET, url, new RequestCallBack<String>() {

// 失败

@Override

public void onFailure(HttpException e, String msg) {

}

// 成功

@Override

public void onSuccess(ResponseInfo<String> result) {

resultText.setText(result.result);



}

});

// ④ 接收数据

} catch (Exception e) {

e.printStackTrace();

}

}

post

登录接口
/LoginServlet 参数 username password

RequestParams
请求参数的表单,内部含Map,可以支持编码设定 例:UTF-8

提交表单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
HttpUtils http = new HttpUtils();

// ③ 发送请求

// http.send(请求方法, 网络地址, 请求参数表单,数据接收对象);

RequestParams form=new RequestParams("UTF-8");

form.addBodyParameter("username", "wengweng");

form.addBodyParameter("pwd", "123");

http.send(HttpMethod.POST, url,form, new RequestCallBack<String>()

文件上传

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/UploadFileServlet  

formfile文件接收字段

// http.send(请求方法, 网络地址, 请求参数表单,数据接收对象);

RequestParams form = new RequestParams("UTF-8");

form.addBodyParameter("formfile", new File("mnt/sdcard/temp.apk"));

http.send(HttpMethod.POST, url, form, new RequestCallBack<String>()

注意事项:可以重写onLoading方法提高用户体验
//读取中

@Override

public void onLoading(long total, long current, boolean isUploading) {

// TODO Auto-generated method stub

super.onLoading(total, current, isUploading);

String currValue = Formatter.formatFileSize(getBaseContext(), current);

String totalValue = Formatter.formatFileSize(getBaseContext(), total);

resultText.setText(currValue + "/" + totalValue);

}

download

注意事项建议重写onLoading方法获取下载进度

  1. 配置权限

  2. 创建HttpUtils对象

  3. 打开下载方法

  4. 保存下载控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
private HttpHandler<File> handler;

@OnClick(R.id.download)

public void download(View view) {

try {

// ① 配置权限

// ② 创建HttpUtils对象

HttpUtils http = new HttpUtils();

// ③ 打开下载方法

// http.download(文件的网络地址, 保存位置,是否支持续传,自动重命名:如果传回文件名, 数据接收对象);

String url = "http://192.168.1.102:8080/web/WiFiKeyPC.zip";

String path = "mnt/sdcard/WiFiKeyPC.zip";

handler = http.download(url, path, true, false, new RequestCallBack<File>() {

@Override

public void onLoading(long total, long current, boolean isUploading) {

super.onLoading(total, current, isUploading);

String currValue = Formatter.formatFileSize(getBaseContext(), current);

String totalValue = Formatter.formatFileSize(getBaseContext(), total);

resultText.setText(currValue + "/" + totalValue);



}



@Override

public void onSuccess(ResponseInfo<File> responseInfo) {

resultText.setText("下载成功保存在" + responseInfo.result.getAbsolutePath());

}



@Override

public void onFailure(HttpException error, String msg) {

resultText.setText("下载失败"+msg);

}

});

// ④ 保存下载控制器



} catch (Exception e) {

e.printStackTrace();

}

}


//下载中断
//HttpHandler 支持 任务取消
@OnClick(R.id.pause)

public void pause(View view) {

if (!handler.isCancelled()) {

Toast.makeText(getBaseContext(), "暂停下载", 0).show();

handler.cancel();

}

}

网络图片异步加载工具–BitmapUtils

重要对象

BitmapUtils
图片加载工具
加载 网络 本地 asset目录 的图片

这里写图片描述

  1. 创建BitmapUtils对象
  2. 给指定ImageView控件加载图片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// String imageUrl =

// "http://images.51cto.com/files/uploadimg/20130322/1724296.png";

// String imageUrl = "assets/tt.jpg";

String imageUrl = "/mnt/sdcard/tt.jpg";



// ① 创建BitmapUtils对象

// BitmapUtils bitmapUtils=new BitmapUtils(上下文, 保存路径);

BitmapUtils bitmapUtils = new BitmapUtils(this, "mnt/sdcard/");

// ② 给指定ImageView控件加载图片

// bitmapUtils.display(控件, 资源地址,载入参数获取对象)

//注意事项1.display需要指定 显示的ImageView控件 2.通过onLoadCompleted方法获取Bitmap设置给ImageView

//3. sd卡必须以 /开头 asset 不要/开头

bitmapUtils.display(image, imageUrl, new BitmapLoadCallBack<View>() {

@Override

public void onLoadCompleted(View container, String uri, Bitmap bitmap, BitmapDisplayConfig config, BitmapLoadFrom from) {

image.setImageBitmap(bitmap);

}



@Override

public void onLoadFailed(View container, String uri, Drawable drawable) {



}

});

ORM数据库工具类DbUtils

ORM即对象关系映射(Object-Relational Mapping),在对象与表之间建议对应关系,将sql封装起来,封装了sql的编写,开发者大量减少sql编写,感觉像在操作集合
这里写图片描述

重要对象

Dbutils
核心对象。支持对象的CRUD

增删改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
@OnClick(R.id.insert)

public void insert(View view) {

// ① 创建DbUtils对象

DbUtils db = DbUtils.create(this);



for (int i = 0; i < 20; i++) {

User u = new User();

u.id = i;

u.name = "测试"+i;

u.age = 12;

u.email = "jiankan@qq.cn";

// ② 保存多条记录

try {

db.save(u);

} catch (DbException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}



}



@OnClick(R.id.delete)

public void delete(View view) {

// ① 创建DbUtils对象

DbUtils db = DbUtils.create(this);

try {

db.deleteById(User.class, "1");

} catch (DbException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}



@OnClick(R.id.update)

public void update(View view) {

// 先查找出一条记录 修改值 后给update并指明修改属性

// ① 创建DbUtils对象

DbUtils db = DbUtils.create(this);

try {

User u = db.findById(User.class, "0");

u.name = "曹操";

db.update(u, "name");

} catch (DbException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

查询与高级查询

Selector 数据筛选对象,具体负责条件语句,例WHERE id<54 AND (age>20 OR age<30) ORDER BY id LIMIT pageSize OFFSET pageOffs
WhereBuilder where拼接条件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
@OnClick(R.id.query)

public void query(View view) {

// ① 创建DbUtils对象

DbUtils db = DbUtils.create(this);

try {

// 全查

List<User> users = db.findAll(User.class);// 查询所有

println(users);



// User u = db.findFirst(条件对象);

// User u = db.findFirst(Selector.from(User.class).where("name",

// "=", "曹操")); //条件查询

// User u = db.findFirst(Selector.from(User.class).where("name",

// "!=", null));//非空查询

// User u = db.findFirst(Selector.from(User.class).where("name",

// "=", null));// 空查询

// System.out.println(u);



} catch (DbException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}



}

//高级查询

@OnClick(R.id.query2)

public void query2(View view) {

// ① 创建DbUtils对象

DbUtils db = DbUtils.create(this);

try {

// 全查

List<User> users = db.findAll(User.class);// 查询所有

println(users);

System.out.println("Selector高级查询");

// 条件查询Selector

List<User> users2 = db.findAll(Selector.from(User.class)//

.where(WhereBuilder.b("id", "<", "10"))// where条

.or(WhereBuilder.b("id", ">", "15")// or

).orderBy("id")// orderby

.limit(3)// limit

.offset(3)// offset 返回值开始位置 下标0代表第一条

);



println(users2);



} catch (DbException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}



}

混淆时注意事项

添加Android默认混淆配置${sdk.dir}/tools/proguard/proguard-android.txt

不要混淆xUtils中的注解类型,添加混淆配置:-keep class * extends java.lang.annotation.Annotation { *; }

对使用DbUtils模块持久化的实体类不要混淆,或者注解所有表和列名称@Table(name=”xxx”),@Id(column=”xxx”),@Column(column=”xxx”),@Foreign(column=”xxx”,foreign=”xxx”);

编译Boost库步骤:

  1. 在官方下载Boost源码包,解压缩

  2. 运行根目录下的bootstap.bat,在当前目录将产生bjam.exe(用来编译boost)

  3. boost有很多库是不需要编译的,只要包含头文件即可,只有少数要编译

  4. 在命令提示符下进入boost根目录

输入bjam –show-libraries(可以查看需要编译的库有哪些)
编译指令:
bjam stage –toolset=msvc-9.0 –with-math –with-regex –with-graph –with-filesystem
–with-random –stagedir=”C:\boost” link=static runtime-link=shared threading=multi debug release

怕麻烦的话可以这样(编译所有库的所有版本):
bjam stage –toolset=msvc-9.0 –stagedir=”C:\boost” –build-type=complete
complete会编译boost组件的所有版本库,时间很长。
当build-type为minimal(默认值)时只编译debug和release模式下动态链接C运行时的静态库
bjam stage –toolset=msvc-9.0 –without-python –without-mpi –without-wave –without-graph_parallel –without-serialization –stagedir=”C:\boost” –build-type=minimal(不写build-type=minima这句也是一样)

bjam的其他选项参数(仅供参考):

stage/install:stage表示只生成库(dll和lib),install还会生成包含头文 件的include目录。
本人推荐使用stage,因为install生成的这个include目录实际就是boost安装包解压缩后的boost目
录 (C:\boost,只比include目录多几个非hpp文件,都很小),所以可以直接使用,而且不同的IDE
都可 以使用同一套头文件,这样既节省编译时间,也节省硬盘空间。
toolset:指定编译器,可选的如borland、gcc、msvc(VC6)、msvc- 9.0(VS2008)等。
without/with:选择不编译/编译哪些库。
stagedir/prefix:stage时使用stagedir,install时使用prefix, 表示编译生成文件的路径。
build-dir:编译生成的中间文件的路径。这个本人这里没用到,默认就在根目录下,目录名为
bin.v2,等编译完成后可将这个目录全部删除(没用了),所以不需要去设置。
link:生成动态链接库/静态链接库。生成动态链接库需使用shared方式,生成静态链接库需使用 static方式。一般boost库可能都是以static方式编译,因为最终发布程序带着boost的dll感觉会比较累赘。
runtime-link:动态/静态链接C/C++运行时库。同样有shared和static两种方 式,这样runtime-link和link一共可以产生4种组合方式,各人可以根据自己的需要选择编译。一般link只选static的话,只需要编译 2种组合即可,即link=static runtime-link=shared和link=static runtime-link=static。
threading:单/多线程编译。一般都写多线程程序,当然要指定multi方式了;如果需要编写单线程程序,那么还需要编译单线程库,可以使用single方式。
debug/release:编译debug/release版本。一般都是程序的debug版本对应库的 debug版本,所以两个都编译。

–show-libraries(可以查看需要编译的库有哪些)
一般mpi和graph_parallel不编译,因为不太完整。

最后在VS2008中设置好包含目录和库目录即可,boost会自动寻找相应的库文件,不用再另外设定。
下面是测试:
vs默认使用动态链接C运行时库的boost,静态链接会出错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

#include <boost/regex.hpp>
#include <iostream>
#include <tchar.h>
using namespace std;
using namespace boost;
int main() {

boost::wregex expression(_T("a.."));

// 匹配至少一个a
if( boost::regex_match(_T("a&888899"), expression) )
{
std::cout<< "Match" << std::endl;
}
else
{
std::cout<< "Not Match" << std::endl;
}
}
结果Not Match