1. 程式人生 > >ButterKnife(註解外掛--快速查詢控制元件等--替代fbc)

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)