早就聽過Butter Knife這個神器,公司最近新開了一個項(xiàng)目,用到了這個框架,但也只是簡單使用自動綁定控件,昨天抽時間看了下官網(wǎng),發(fā)現(xiàn)這個框架還可以做其他很多的工作,來提高開發(fā)效率,總結(jié)一下常用用法。
一 導(dǎo)入
dependencies {
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
目前最新版為8.5.1
二 用法
-
單個控件綁定
class ExampleActivity extends Activity {
@BindView(R.id.title) TextView title;//@BindView注解加控件id標(biāo)注要查找的控件
@BindView(R.id.subtitle) TextView subtitle;
@BindView(R.id.footer) TextView footer;@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_activity); ButterKnife.bind(this);//在當(dāng)前activity自動綁定 // TODO Use fields... } } 資源綁定
class ExampleActivity extends Activity {
@BindString(R.string.title) String title;//@BindString注解加資源id標(biāo)注要查找的資源
@BindDrawable(R.drawable.graphic) Drawable graphic;
@BindColor(R.color.red) int red; // int or ColorStateList field
@BindDimen(R.dimen.spacer) Float spacer; // int (for pixel size) or float (for exact value) field
// ...
}-
根據(jù)自定義的根布局來自動綁定布局里的控件
public class FancyFragment extends Fragment {
@BindView(R.id.button1) Button button1;
@BindView(R.id.button2) Button button2;@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fancy_fragment, container, false); ButterKnife.bind(this, view);//自動綁定Activity根部局控件的時候直接傳this即可 // TODO Use fields... return view; } } -
在adapter里綁定控件
public class MyAdapter extends BaseAdapter {
@Override public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view != null) {
holder = (ViewHolder) view.getTag();
} else {
view = inflater.inflate(R.layout.whatever, parent, false);//item布局
holder = new ViewHolder(view);//傳給ViewHolder
view.setTag(holder);
}holder.name.setText("John Doe"); // etc... return view; } static class ViewHolder { @BindView(R.id.title) TextView name; @BindView(R.id.job_title) TextView jobTitle; public ViewHolder(View view) { ButterKnife.bind(this, view);//其實(shí)就是根據(jù)我們自己提供的根布局來綁定控件 } } } 控件集合綁定
@BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name })
List<EditText> nameViews;同時操作多個控件
ButterKnife.apply(nameViews, DISABLE);
ButterKnife.apply(nameViews, ENABLED, false);
DISABLE,ENABLED是ButterKnife提供的一種數(shù)據(jù)類型ButterKnife.Action<View>,它是一個接口,需要我們根據(jù)需求實(shí)現(xiàn)其中的apply()方法,這里:
static final ButterKnife.Action<View> DISABLE = new ButterKnife.Action<View>() {
@Override public void apply(View view, int index) {
view.setEnabled(false);
}
};
static final ButterKnife.Setter<View, Boolean> ENABLED = new ButterKnife.Setter<View, Boolean>() {
@Override public void set(View view, Boolean value, int index) {
view.setEnabled(value);
}
};
注意:ButterKnife.apply具有多個重載方法,例如還可以設(shè)置屬性等:
ButterKnife.apply(nameViews, View.ALPHA, 0.0f);單個控件事件綁定
@OnClick(R.id.submit)//注解控件
public void test(View view) {//點(diǎn)擊控件后觸發(fā)的方法,參數(shù)可選
// TODO submit data to server...
}多個控件事件綁定
@OnClick({ R.id.door1, R.id.door2, R.id.door3 })
public void test(View view) {
switch(view.getId()){
case R.id.door1:
//todo something
break;
case R.id.door2:
//todo something
break;
case R.id.door3:
//todo something
break;
default:
break;
}
}-
綁定重置
與Activity相比,F(xiàn)ragment的視圖具有不同的生命周期,在onCreateView中綁定視圖的時候,Butter Knife會返回一個Unbinder類型的對象,我們可以在合適的生命周期回調(diào)方法中調(diào)用它unbind()方法來解除綁定。
public class FancyFragment extends Fragment {
@BindView(R.id.button1) Button button1;
@BindView(R.id.button2) Button button2;
private Unbinder unbinder;@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);//返回unbinder對象 // TODO Use fields... return view; } @Override public void onDestroyView() { super.onDestroyView(); unbinder.unbind();//解除綁定 } } -
可選綁定(OPTIONAL BINDINGS)
通常,控件綁定與事件綁定我們都需要,但是如果沒有找不到目標(biāo)view的話會報錯,為了避免這種情況,可以用@Nullable和@Optional這兩個注解,如果找不到目標(biāo)view存在,就自動綁定,不存在,也不會出錯。
@Nullable @BindView(R.id.might_not_be_there) TextView mightNotBeThere;@Optional @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() { // TODO ... } ButterKnife.findById()
Butter Knife提供了一個findById()的方法,它主要用來簡化控件類型轉(zhuǎn)化:
View view = LayoutInflater.from(context).inflate(R.layout.thing, null);
TextView firstName = ButterKnife.findById(view, R.id.first_name);
TextView lastName = ButterKnife.findById(view, R.id.last_name);
ImageView photo = ButterKnife.findById(view, R.id.photo);
findById()有兩個參數(shù),第一個是目標(biāo)view,有三種類型:View,Activity,Dialog,第二個參數(shù)是要查找的控件id。它主要是通過返回泛型來自動執(zhí)行類型轉(zhuǎn)換。自動生成綁定的插件
最后推薦一個插件android butterknife zelezny,可以自動生成綁定代碼:

具體用法請參考:http://blog.csdn.net/dreamlivemeng/article/details/51261170
參考: