ButterKnife笔记
2016-06-21 12:14
281 查看
译自:http://jakewharton.github.io/butterknife/
class…{
@BindView(R.id.title)TextView
title;
… oncreate(…) {
…
setContentView(R.layout.simple_activity);
ButterKnife.bind(this);
}
}
绑定资源
@BindString(R.string.title)String
title;
@BindDrawable(R.drawable.graphic)Drawable
graphic;
@BindColor(R.color.red)int
red; // int orColorStateList field
@BindDimen(R.dimen.spacer)Float
spacer;
非Activity绑定
ButterKnife.bind(this,
view);
view列表
@BindViews({ R.id.first_name,
R.id.middle_name, R.id.last_name})
List<EditText> nameViews;
apply方法允许你一次性对列表的所有view操作
ButterKnife.apply(nameViews,
DISABLE);
ButterKnife.apply(nameViews,
ENABLED, false);
Action和Setter接口允许你定义简单的行为
static finalButterKnife.Action<View>
DISABLE = newButterKnife.Action<View>()
{
@Overridepublic voidapply(View view,int
index) {
view.setEnabled(false);
}
};
static final ButterKnife.Setter<View,Boolean>
ENABLED= new
ButterKnife.Setter<View,Boolean>()
{
@Overridepublic void set(View view,Boolean
value,int index) {
view.setEnabled(value);
}
};
Android属性也可以用apply方法。
ButterKnife.apply(nameViews,View.ALPHA,0.0f);
监听绑定
@OnClick(R.id.submit)
public voidsubmit(View view) {
//TODO submit data to server...
}
listener方法的所有参数都可选
@OnClick(R.id.submit)
public voidsubmit() {
//TODO submit data to server...
}
确定类型它会自动转换
@OnClick(R.id.submit)
public voidsayHi(Button button) {
button.setText("Hello!");
}
为相同的事件处理指定多个ID
@OnClick({ R.id.door1,
R.id.door2, R.id.door3})
public voidpickDoor(DoorView door) {
if (door.hasPrizeBehind()) {
Toast.makeText(this,"You
win!", LENGTH_SHORT).show();
} else
{
Toast.makeText(this,"Tryagain",LENGTH_SHORT).show();
}
}
自定义的view不指定ID就可以绑定它们的listener
public classFancyButton
extendsButton
{
@OnClick
publicvoid onClick(){
//TODO do something!
}
}
绑定重启
Fragment和activiy的生命周期不同。当在conCreateView绑定,需要在onDestroyView中设置view为null。当调用bind方法时会返回Unbinder的实例,在适合的地方调用它的unbind方法。
public classFancyFragmentextendsFragment{
@BindView(R.id.button1)Button
button1;
@BindView(R.id.button2)Button
button2;
privateUnbinderunbinder;
@Override public
View onCreateView(LayoutInflater inflater,ViewGroup
container,Bundle savedInstanceState) {
View view
= inflater.inflate(R.layout.fancy_fragment,
container, false);
unbinder = ButterKnife.bind(this,
view);
//TODO Use fields...
return view;
}
@Override public voidonDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
有选择地绑定
默认下,@Bind和listener绑定都需要。如果目标view未找到则会抛出异常。
为了阻止这种行为并且装造一个有选择性的绑定,加@Nullable注释给属性,或@Optional注释给方法。
多方法监听
对于多个返回的监听器可以注释所有的方法。每个注释有个默认的callback,用callback参数改变默认的callback。
@OnItemSelected(R.id.list_view)
voidonItemSelected(int position) {
//TODO ...
}
@OnItemSelected(value= R.id.maybe_missing,
callback = NOTHING_SELECTED)
voidonNothingSelected() {
//TODO ...
}
福利
为了简化从View,Activity或Dialog中找view,提供了findById方法。
View view=
LayoutInflater.from(context).inflate(R.layout.thing,null);
TextViewfirstName=
ButterKnife.findById(view,
R.id.first_name);
TextViewlastName=
ButterKnife.findById(view,
R.id.last_name);
ImageViewphoto=
ButterKnife.findById(view,
R.id.photo);
安装
项目的gradle中引入
模块的gradle中引入
注意:被bind的view不能为private,否则其他的类无法为该类正确初始化。
class…{
@BindView(R.id.title)TextView
title;
… oncreate(…) {
…
setContentView(R.layout.simple_activity);
ButterKnife.bind(this);
}
}
绑定资源
@BindString(R.string.title)String
title;
@BindDrawable(R.drawable.graphic)Drawable
graphic;
@BindColor(R.color.red)int
red; // int orColorStateList field
@BindDimen(R.dimen.spacer)Float
spacer;
非Activity绑定
ButterKnife.bind(this,
view);
view列表
@BindViews({ R.id.first_name,
R.id.middle_name, R.id.last_name})
List<EditText> nameViews;
apply方法允许你一次性对列表的所有view操作
ButterKnife.apply(nameViews,
DISABLE);
ButterKnife.apply(nameViews,
ENABLED, false);
Action和Setter接口允许你定义简单的行为
static finalButterKnife.Action<View>
DISABLE = newButterKnife.Action<View>()
{
@Overridepublic voidapply(View view,int
index) {
view.setEnabled(false);
}
};
static final ButterKnife.Setter<View,Boolean>
ENABLED= new
ButterKnife.Setter<View,Boolean>()
{
@Overridepublic void set(View view,Boolean
value,int index) {
view.setEnabled(value);
}
};
Android属性也可以用apply方法。
ButterKnife.apply(nameViews,View.ALPHA,0.0f);
监听绑定
@OnClick(R.id.submit)
public voidsubmit(View view) {
//TODO submit data to server...
}
listener方法的所有参数都可选
@OnClick(R.id.submit)
public voidsubmit() {
//TODO submit data to server...
}
确定类型它会自动转换
@OnClick(R.id.submit)
public voidsayHi(Button button) {
button.setText("Hello!");
}
为相同的事件处理指定多个ID
@OnClick({ R.id.door1,
R.id.door2, R.id.door3})
public voidpickDoor(DoorView door) {
if (door.hasPrizeBehind()) {
Toast.makeText(this,"You
win!", LENGTH_SHORT).show();
} else
{
Toast.makeText(this,"Tryagain",LENGTH_SHORT).show();
}
}
自定义的view不指定ID就可以绑定它们的listener
public classFancyButton
extendsButton
{
@OnClick
publicvoid onClick(){
//TODO do something!
}
}
绑定重启
Fragment和activiy的生命周期不同。当在conCreateView绑定,需要在onDestroyView中设置view为null。当调用bind方法时会返回Unbinder的实例,在适合的地方调用它的unbind方法。
public classFancyFragmentextendsFragment{
@BindView(R.id.button1)Button
button1;
@BindView(R.id.button2)Button
button2;
privateUnbinderunbinder;
@Override public
View onCreateView(LayoutInflater inflater,ViewGroup
container,Bundle savedInstanceState) {
View view
= inflater.inflate(R.layout.fancy_fragment,
container, false);
unbinder = ButterKnife.bind(this,
view);
//TODO Use fields...
return view;
}
@Override public voidonDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
有选择地绑定
默认下,@Bind和listener绑定都需要。如果目标view未找到则会抛出异常。
为了阻止这种行为并且装造一个有选择性的绑定,加@Nullable注释给属性,或@Optional注释给方法。
多方法监听
对于多个返回的监听器可以注释所有的方法。每个注释有个默认的callback,用callback参数改变默认的callback。
@OnItemSelected(R.id.list_view)
voidonItemSelected(int position) {
//TODO ...
}
@OnItemSelected(value= R.id.maybe_missing,
callback = NOTHING_SELECTED)
voidonNothingSelected() {
//TODO ...
}
福利
为了简化从View,Activity或Dialog中找view,提供了findById方法。
View view=
LayoutInflater.from(context).inflate(R.layout.thing,null);
TextViewfirstName=
ButterKnife.findById(view,
R.id.first_name);
TextViewlastName=
ButterKnife.findById(view,
R.id.last_name);
ImageViewphoto=
ButterKnife.findById(view,
R.id.photo);
安装
项目的gradle中引入
buildscript { repositories { mavenCentral() } dependencies { classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' } }
模块的gradle中引入
apply plugin: 'android-apt' android { ... } dependencies { compile 'com.jakewharton:butterknife:8.1.0' apt 'com.jakewharton:butterknife-compiler:8.1.0' }
注意:被bind的view不能为private,否则其他的类无法为该类正确初始化。
相关文章推荐
- JetBrains使用技能分享征集大赛优秀作品——用webstorm开发NodeJS项目
- DTD文档模型和HTML基础
- 剑指offer题解 变态跳台阶
- JS中IP地址与整数的相互转换
- Javascript实现图片加载从模糊到清晰显示的方法
- Javascript类型系统之String字符串类型详解
- studio中的assets存放路径,加载HTML文件
- Extracting Lines Using Differential Geometry and Gaussian Smooth--Carsten Steger 使用微分几何和高斯平滑进行边缘提取
- 原生JS封装ajax方法
- JS模仿腾讯图片站的图片翻页按钮效果完整实例
- 详解CSS中的选择器优先级顺序
- jQuery ajax表单提交
- 剑指offer题解 数值的整数次方
- ByteBuffer.allocateDirect 与 allocate 方法
- JS实现简单的右下角弹出提示窗口完整实例
- ROS学习--语义理解NODE(NLU,NLP)
- angularjs 系列之$q和promise
- 图文讲解CSS的Box Model盒模型中的边距
- Chrome 中的 JavaScript 断点设置和调试技巧
- css3弹性盒模型(Flexbox)