本文为菜鸟窝作者刘婷的连载。”商城项目实战”系列来聊聊仿”京东淘宝的购物商城”如何实现。
刚开始的时候,在 GitHub 上面出现了一款强大的开源框架叫 xUtils,里面包含了很多实用的android工具,并且支持大文件上传,更全面的 http 请求协议支持(10种谓词),拥有更加灵活的 ORM,更多的事件注解支持且不受混淆影响,该框架最低兼容版本为 android 2.2 (api level 8)。但是随着 Android 版本的不断更新,特别是 Android 6.0 之后,xUtils 的兼容不是很好,因此就出现了升级版的 xUtils,也就是 xUtils3。
xUtils3 是 xUtils 的升级版本,包含了orm, http(s), image, view注解, 但依然很轻量级(246K), 最主要是特性强大, 方便扩展,当然对比之前的 xUtils,在 xUtils3 中很多的 API 接口都已经改变了,使用方法也和之前不同了,所以本文主要是讲解最新的 xUtils3 的详细介绍以及该框架下的 ViewUtils 模块的最新用法。
xUtils3 的主要特性如下。
xUtils3 的一些其他特性。
xUtils 中目前包括了主要的四大模块,分别为 DbUtils 模块、ViewUtils 模块、HttpUtils 模块以及 BitmapUtils 模块,下面对这四大模块进行介绍。
ViewUtils 的主要作用有两点,一是可以完全注解方式就可以进行 UI 绑定和事件绑定,另外一个就是无需 findViewById 和 setOnClickListener 等。而其中的 UI 绑定和事件绑定下面详细介绍。
UI 绑定简而言之就是针对于控件和 View 了,分为多种绑定方法。
@ContentView(R.layout.view_acti); //setContentView 注解在activity的声明上方
@ViewInject(R.id.lv_test); //反射view 注解在一个view声明上
事件绑定就是指监听事件的注解,比如 setOnClickListener 等。
@Event(R.id.button) //将一个自定义的方法绑定到一个 view 的事件上
至于具体的使用方法就在下面了。
xUtils3 框架中包含了很多的工具,主要的四大模块功能也很强大,这次主要是要讲解其中的 ViewUtils 模块的使用。
在 module 下的 build.gradle 文件下面添加对 xUtils3 的依赖。
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.2.0'
compile 'com.android.support.constraint:constraint-layout:1.0.1'
testCompile 'junit:junit:4.12'
compile 'org.xutils:xutils:3.5.0'
}
在 Activity 和 Fragment 中初始化 ViewUtils 模块略有不同,所以就分开介绍了。
在 Activity 中初始化比较简单,直接在 onCreate 中一行代码就搞定了。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this);
}
Fragment 的生命周期依赖于 Activity,另外在 Fragment 中一些方法也与 Activity 不同,所以 ViewUtils 的初始化方法也不太一样了。
private boolean injected = false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
injected = true;
return x.view().inject(this, inflater, container);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (!injected) {
x.view().inject(this, this.getView());
}
}
其中 injected 是用来标识是否已经注入了 View ,如果还没有注入,在 onViewCreated 中要写入注入 View 的方法。
一般在 Activity 或者 Fragment 中声明控件,都要使用方法 findViewById,如果控件一旦多了,就会很麻烦,代码要写不少,但是使用 ViewUtils 可以通过注解的方式直接进行 UI 绑定,方法也很简单。
@ViewInject(R.id.textView)
private TextView textView;
在为 Activity 或者 Fragment 添加布局时,我们都会使用到 setContentView(int layoutRes) 方法,在 ViewUtils 添加了直接注解布局的方法,如下。
@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
.....
}
在 Fragment 中注解方法是一样的,在 Fragment 中直接添加就好。
在之前的按钮的点击事件、列表选项的 item 点击事件等,写起来代码都比较多些,而使用 ViewUtils 都可以变得简单起来,先来看下按钮的点击事件的绑定。
// 取消了之前使用方法名绑定事件的方式,使用id绑定不受混淆影响
// 支持绑定多个id @Event({R.id.id1, R.id.id2, R.id.id3})
// or @Event(value={R.id.id1, R.id.id2, R.id.id3}, parentId={R.id.pid1, R.id.pid2, R.id.pid3})
// 更多事件支持参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。
@Event(R.id.test_button)
public void testButtonClick(View v) { // 方法签名必须和接口中的要求一致
...
}
上面是按钮的点击事件的绑定,很方便,再来看看列表选项的 item 点击事件的绑定。
//选项的点击事件 OnItemClickListener
@Event(value = R.id.lv_img, type = AdapterView.OnItemClickListener.class)
private void onImageItemClick(AdapterView parent, View view, int position, long id) {
....
}
ViewUtils 所支持的事件的绑定还有很多种,这里就主要介绍上面两种,更多的使用方法请参考 xUtils3 源码。
xUtils3 在 xUtils 的基础上优化了不少,ViewUtils 注解也更为的简单明了,有了 ViewUtils,我们就不用像之前一样不断的对控件进行声明,另外对于事件的处理也简化了不少,在后期的商城项目实战中,都将使用 ViewUtils 来做 UI 的绑定以及事件的绑定。