Butter Knife
Field and method binding for Android views
Butter Knife采用annotation(注解)的方式帮你去绑定变量。而不是采用findViewById的方式.
举个简单例
第一步:下载ButterKnife开发包,下载地址如下:
下载地址
第二步:配置开发工具,我暂时用的是eclipse,将下载的ButterKnife开发包放到工程的libs下面
配置Annotation Processing,这里配置是导入实现了AbstractProcessor接口的包,编译的时候自动执行该接口下的process(),一般在次函数做一些注解解释操作。
add jars将libs下的butterKnife.jar包加进去
第三步:编程实现
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.csm.butterknife.MainActivity" >
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
MainActivity
package com.csm.butterknife;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class MainActivity extends Activity {
/**
* 注解的View对象
*/
@Bind(R.id.tv_title)
TextView tv_title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 注解初始化
*/
ButterKnife.bind(this);
tv_title.setText("Hello Annotations");
}
@OnClick(R.id.tv_title)
public void Hello() {
Toast.makeText(this, "Hello Annotations", Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
ButterKnife.unbind(this);
}
/**
* 打印处输入的内容
* @param str
* @return
*/
private String print(String str) {
System.out.println(str);
return str != null ? str:"";
}
}
第四步:编译的时候会生成文件MainActivity$$ViewBinder类,其实在运行时执行ButterKnife.bind(this)的时候就是执行了下面的文件的bind方法。实现了最终的绑定。所以绑定还是运行时的,但是注解解释是在编译期的。
注解生成辅助文件内容:
// Generated code from Butter Knife. Do not modify!
package com.csm.butterknife;
import android.view.View;
import butterknife.ButterKnife.Finder;
import butterknife.ButterKnife.ViewBinder;
public class MainActivity$$ViewBinder<T extends com.csm.butterknife.MainActivity> implements ViewBinder<T> {
@Override public void bind(final Finder finder, final T target, Object source) {
View view;
view = finder.findRequiredView(source, 2131296319, "field 'tv_title' and method 'Hello'");
target.tv_title = finder.castView(view, 2131296319, "field 'tv_title'");
view.setOnClickListener(
new butterknife.internal.DebouncingOnClickListener() {
@Override public void doClick(
android.view.View p0
) {
target.Hello();
}
});
}
@Override public void unbind(T target) {
target.tv_title = null;
}
}
第五步:运行效果