-
简介
对一个成员变量使用@BindView注解,并传入一个View ID, ButterKnife 就能够帮你找到对应的View,并自动的进行对象类型转换(将View转换为特定的子类),之后就可以直接操作该View了:
绑定Activity
public class ButterKnifeActivity extends Activity {
//(2)绑定布局组件
@BindView(R.id.nameTv)
protected TextView mNameTv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
//(1)进行绑定布局,要在 setContentView()函数之后
ButterKnife.bind(this);
//(3)下面就可以直接对mNameTv进行操作了:赋值
mNameTv.setText(“张三”);
}
}
-
优势
在android编程过程中,我们会写大量的布局和点击事件,像初始 view、设置view监听这样简单而重复的操作让人觉得麻烦类,所以可以采用注解的方式去绑定。
- 强大的View绑定和Click事件处理功能
- 代码清晰,可读性强
-
功能
-
绑定组件
绑定组件 -
绑定资源类型文件(/res/value/... 下的各种资源)
绑定各种资源文件 -
进行事件的监听
绑定事件监听
-
-
使用方式
- grade引用方式
- Project的build.gradle文件中增加classpath内容:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //增加这一句
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
- 在app的build.gradle中使用
apply plugin: 'com.neenbedankt.android-apt'//增加这一句
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.jakewharton:butterknife:8.1.0'
apt 'com.jakewharton:butterknife-compiler:8.1.0'//增加这一句
}
- 注意将项目模块的JDK类型设置成1.7,
- 代码中使用
-
绑定Activity
public class ButterKnifeActivity extends Activity { //(2)绑定布局组件 @BindView(R.id.nameTv) protected TextView mNameTv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_activity); //(1)进行绑定布局,要在 setContentView()函数之后 ButterKnife.bind(this); //(3)下面就可以直接对mNameTv进行操作赋值了 mNameTv.setText(“张三”); } }
-
绑定Fragment
public class BaseFragment extends Fragment { //(2)绑定布局组件 @BindView(R.id.nameTv) protected TextView mNameTv; @Override public View onCreateView() { mRootView=inflater.inflate(getContentViewId(), container,false); //(1)进行绑定布局,mRootView被创建之后 ButterKnife.bind(this, mRootView);//绑定framgent //(3)下面就可以直接对mNameTv进行操作赋值了 mNameTv.setText(“张三”); return mRootView; } }
-
绑定ViewHolder
public class TestAdapter extends BaseAdapter { @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(context).inflate( R.layout.layout_list_item, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.textview.setText("item=====" + position); return convertView; } static class ViewHolder { @Bind(R.id.hello_world) TextView textview; public ViewHolder(View view) { ButterKnife.bind(this, view); } } }
- 绑定资源
@BindString(R.string.app_name) String appName;//sting @BindColor(R.color.red) int textColor;//颜色 @BindDrawable(R.mipmap.ic_launcher) Drawable drawable;//图片 @BindDrawable(R.drawable.selector_image) Drawable selector;
- 绑定事件监听
//直接绑定一个方法 @OnClick(R.id.submit) public void submit(View view) { // TODO submit data to server... } //所有监听方法的参数是可选的 @OnClick(R.id.submit) public void submit() { // TODO submit data to server... } //监听方法的参数是特殊类型的,将自动转换 @OnClick(R.id.submit) public void submit(Button button) { // TODO submit data to server... } //多个组件监听同一个点击时间,避免重复调用 @OnClick(R.id.submit1, R.id.submit2, R.id.submit3) public void submit(Button button) { // TODO submit data to server... } //给EditText加addTextChangedListener(即添加多回调方法 的监听的使用方法),利用指定回调,实现想回调的方法 @OnTextChanged(value = R.id.mobileEditText, callback = OnTextChanged.Callback. BEFORE_TEXT_CHANGED) void beforeTextChanged(CharSequence s, int start, int count, int after) { } @OnTextChanged(value = R.id.mobileEditText, callback = OnTextChanged.Callback. TEXT_CHANGED) void onTextChanged(CharSequence s, int start, int before, int count) { } @OnTextChanged(value = R.id.mobileEditText, callback = OnTextChanged.Callback. AFTER_TEXT_CHANGED) void afterTextChanged(Editable s) { }
- 对一组View进行绑定
@Bind({ R.id.first_name, R.id.middle_name, R.id.last_name }) List<TextView> nameViews;
- 对一组View进行事件监听
@ OnClick({ R.id.first_name, R.id.middle_name, R.id.last_name }) List<TextView> nameViews;
-
- 代码中使用
-
使用心得
- Activity ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind
- Fragment ButterKnife.bind(this, rootView);
- 被绑定的成员属性不能用private or static 修饰否则会报错
-
相关学习文章:
- 该文章深入分析Butterknife原理,解析代码:
http://www.360doc.com/content/16/0715/17/8279768_575749596.shtml
- 该文章深入分析Butterknife原理,解析代码:
网友评论