您的位置:首页 > Web前端

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中引入

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,否则其他的类无法为该类正确初始化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: