ButterKnife(註解外掛--快速查詢控制元件等--替代fbc)
這個開源庫可以讓我們從大量的findViewById()和setonclicktListener()解放出來,其對效能的影響微乎其微(檢視過Butter Knife的原始碼,其自定義註解的實現都是限定為RetentionPolicy.CLASS,也就是到編譯出.class檔案為止有效,在執行時不額外消耗效能,其是通過java註解自動生成java程式碼的形式來完成工作),其也有一個明顯的缺點,那就是程式碼的可讀性差一些,但瞭解了之後,上手也很快。。。至於原理可以插檢視上一篇部落格(http://blog.csdn.net/cao_fang_zi/article/details/52462664)
控制元件物件例項化
也就是 findViewById(),一直以來的做法都是一個個定義,然後在 setContentView() 或 inflate() 之後一一來findViewById()進行例項化,而使用 ButterKnife,你只需要在程式碼中 使用註解方式進行物件申明,然後在 setContentView() 或 inflate() 之後呼叫一句話,那麼申明的所有物件自動創建出來。
//為Button添加註解
@InjectView(R.id.ok_btn) //控制元件對應的ID
Button mBtn;
@InjectView(R.id.title_text)
TextView mTitleTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
//呼叫ButterKnife這個註解處理器的inject為我們完成fbc的工作
ButterKnife.inject(this);
//這樣之後就可以直接使用變量了
mTitleTextView.setText("test");
}
Fragment的和adapter裡也可以用,不過呼叫時要多加一個root view引數。
Fragegment使用時記得要實現自己的onDestroyView,並在其中將ButterKnife.reset
public class FancyFragment extends Fragment {
@InjectView(R.id.button1) Button button1;
@InjectView(R.id.button2) Button button2;
@Override View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fancy_fragment, container, false);
//呼叫Butter的過載方法,後就可以使用我們的控制元件物件了
ButterKnife.inject(this, view);
// TODO Use "injected" views...
return view;
}
}
//重寫該方法中,並在該方法中重置處理器
@Override void onDestroyView() {
super.onDestroyView();
//重置註解處理器
ButterKnife.reset(this);
}
**還可以例項化控制元件陣列,註解多一個s,也就是 InjectViews**
@InjectViews({ R.id.first_name, R.id.middle_name, R.id.last_name })
List nameViews ;
**解放監聽新增**
如下,可以直接為 R.id.submit這個控制元件新增OnClickListener為submit函式,流弊啊。。。
@OnClick(R.id.submit)
public void submit() {
// TODO submit data to server...
}
還可以批量為多個控制元件新增為同一個響應函式:
@OnClick({ R.id.door1, R.id.door2, R.id.door3 })
public void pickDoor(DoorView door) {
if (door.hasPrizeBehind()) {
Toast.makeText(this, “You win!”, LENGTH_SHORT).show();
} else {
Toast.makeText(this, “Try again”, LENGTH_SHORT).show();
}
}
經過這麼久的時間其已經更新了,不過還是與以前的版本相容的
class ExampleActivity extends Activity {
@FindView
(R.id.user) EditText username;
@FindView
(R.id.pass) EditText password;
@OnClick
(R.id.submit) void submit() {
// TODO call server…
}
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.bind(this);
// TODO Use fields…
}
}
“`
原文地址(http://www.cnblogs.com/flyme/p/4517560.html)