3. Android框架和工具之 xUtils(ViewUtils )

1. ViewUtils 作用:

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

2. UI绑定 和 事件绑定

(1)UI绑定

下面我們看下具體的代碼,順便對比下注解的方式绑定ID和findViewById之間的差別:

注解的方式绑定ID

 1     @ViewInject(R.id.btn)
 2     private Button btn;
 3     
 4     @ViewInject(R.id.img)
 5     private ImageView img;
 6     
 7     @ViewInject(R.id.list)
 8     private ListView list;
 9     
10     @Override
11     protected void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.activity_second);
14         ViewUtils.inject(this);
15     }

使用findViewById绑定ID

 1 @Override
 2     protected void onCreate(Bundle savedInstanceState) {
 3         super.onCreate(savedInstanceState);
 4         setContentView(R.layout.activity_second);
 5         
 6         btn = (Button) findViewById(R.id.btn);
 7         img = (ImageView) findViewById(R.id.img);
 8         list = (ListView) findViewById(R.id.list);
 9         
10     }

  如果項目中得Activity中的控件相當多,那麼想象一下代碼中累積的那一大坨就真心受不了。通過xUtils的簡單注解,就能輕松擺脫無盡壞味道的代碼。

注意:在使用注解绑定控件的時候,一定記得在onCreate中調用ViewUtils.inject(this);

(2)事件绑定
下面我們看下具體的代碼,順便對比下两种事件绑定:

使用ViewUtils

 1     @OnClick({ R.id.btn, R.id.img })
 2     public void clickMethod(View v) {
 3         Toast.makeText(SecondActivity.this, "you clicked button!",
 4                 Toast.LENGTH_SHORT).show();
 5     }
 6 
 7     @OnItemClick(R.id.list)
 8     public void itemClick(AdapterView<?> parent, View view, int position,long id) {
 9         Toast.makeText(SecondActivity.this, "position--->" + position,
10                 Toast.LENGTH_SHORT).show();
11     }

平常Android的事件绑定

 1      btn.setOnClickListener(this);
 2 
 3      list.setOnItemClickListener(new OnItemClickListener() {
 4             @Override
 5             public void onItemClick(AdapterView<?> parent, View view,
 6                     int position, long id) {
 7                 Toast.makeText(SecondActivity.this, "position--->" + position,
 8                         Toast.LENGTH_SHORT).show();
 9             }
10         });
11 
12     @Override
13     public void onClick(View v) {
14         switch (v.getId()) {
15         case R.id.btn:
16             Toast.makeText(SecondActivity.this, "you clicked button!",
17                     Toast.LENGTH_SHORT).show();
18             break;
19         default:
20             break;
21         }
22     }

3. ViewUtils 基本使用:

 (1)新建一个Android工程,命名为"ViewUtils",如下:

(2)首先我们来到布局文件之中:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     tools:context="com.himi.viewutils.MainActivity" >
 7 
 8     <LinearLayout
 9         android:layout_width="match_parent"
10         android:layout_height="wrap_content"
11         android:orientation="horizontal" >
12 
13         <Button
14             android:id="@+id/button1"
15             android:layout_width="0dp"
16             android:layout_height="wrap_content"
17             android:layout_weight="1"
18             android:text="按钮1" />
19 
20         <Button
21             android:id="@+id/button2"
22             android:layout_width="0dp"
23             android:layout_height="wrap_content"
24             android:layout_weight="1"
25             android:text="按钮2" />
26     </LinearLayout>
27 
28     <ListView
29         android:id="@+id/lv"
30         android:layout_width="match_parent"
31         android:layout_height="match_parent" >
32     </ListView>
33 
34 </LinearLayout>

(3)接着来到MainActivity,如下:

 1 package com.himi.viewutils;
 2 
 3 import com.lidroid.xutils.ViewUtils;
 4 import com.lidroid.xutils.view.annotation.ViewInject;
 5 import com.lidroid.xutils.view.annotation.event.OnClick;
 6 import com.lidroid.xutils.view.annotation.event.OnItemClick;
 7 
 8 import android.app.Activity;
 9 import android.os.Bundle;
10 import android.view.View;
11 import android.widget.AdapterView;
12 import android.widget.ArrayAdapter;
13 import android.widget.Button;
14 import android.widget.ListView;
15 import android.widget.Toast;
16 
17 public class MainActivity extends Activity {
18     
19     private String[] data = {
20         "吕布","赵云","关羽","张飞","许褚","马超"    
21     };
22     
23     /**
24      * 注入View到Activity
25      */
26     
27     @ViewInject(R.id.button1)
28     private Button button1;
29     
30     @ViewInject(R.id.button2)
31     private Button button2;
32     
33     @ViewInject(R.id.lv)
34     private ListView lv;
35     
36     
37 
38     @Override
39     protected void onCreate(Bundle savedInstanceState) {
40         super.onCreate(savedInstanceState);
41         setContentView(R.layout.activity_main);
42         //不能少
43         ViewUtils.inject(this);
44         
45         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
46                 android.R.layout.simple_list_item_1, data);
47         lv.setAdapter(adapter);
48         
49         
50         
51     }
52     
53     @OnClick({R.id.button1,R.id.button2})
54     public void click(View v) {//点击方法名可以随意取
55         if(v.getId() == R.id.button1) {
56             Toast.makeText(this, "点击了按钮1", 0).show();
57         } 
58         if(v.getId() == R.id.button2) {
59             Toast.makeText(this, "点击了按钮2", 0).show();
60         } 
61     }
62     
63     @OnItemClick(R.id.lv)//item点击方面名随便取
64     public void itemClick(AdapterView<?> parent, View view, 
65             int position,long id) {
66         Toast.makeText(this, "你点击了按钮了 "+data[position], 0).show();
67     }
68 
69     
70 }

上面没有使用到 网络 和 SD卡,没有必要添加权限

(4)布署程序到手机上,如下:

4. 上面使用到的是注入View 到Activity,其实还有很多种注入View的方式,如下:

// xUtils的view注解要求必须提供id,以使代码混淆不受影响。
@ViewInject(R.id.textView)
    TextView textView;

//@ViewInject(vale=R.id.textView, parentId=R.id.parentView)
    //TextView textView;

@ResInject(id = R.string.label, type = ResType.String)
    private String label;

// 取消了之前使用方法名绑定事件的方式,使用id绑定不受混淆影响
// 支持绑定多个id @OnClick({R.id.id1, R.id.id2, R.id.id3})
// or @OnClick(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。
@OnClick(R.id.test_button)
public void testButtonClick(View v) { // 方法签名必须和接口中的要求一致
    ...
}
...
//在Activity中注入
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ViewUtils.inject(this); //注入view和事件
    ...
    textView.setText("some text...");
    ...
}
//在Fragment中注入
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.bitmap_fragment, container, false); // 加载fragment布局
    ViewUtils.inject(this, view); //注入view和事件
    ...
}
//在PreferenceFragment中注入
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    ViewUtils.inject(this, getPreferenceScreen()); //注入view和事件
    ...
}
// 其他重载
// inject(View view);
// inject(Activity activity)
// inject(PreferenceActivity preferenceActivity)
// inject(Object handler, View view)
// inject(Object handler, Activity activity)
// inject(Object handler, PreferenceGroup preferenceGroup)
// inject(Object handler, PreferenceActivity preferenceActivity)
原文地址:https://www.cnblogs.com/hebao0514/p/5439068.html