標籤:
常常聽到這麼一個口號,叫做“努力做個愛偷懶的程式猿”。顯然,Android ButterKnife也在一定程度上協助了你成為一名偷懶的程式猿。作為Android開發人員,你肯定對findViewById(),setOnClickListener(),setOnClickListener()等等非常熟悉,久而久之,是不是厭煩了這些東西,簡單沒營養,又不得不寫,這時候,諸如Android ButterKnife,AndroidAnnotations等開源架構就出現了。
ButterKnife新特性:
1、支援 Activity 中的 View 注入
2、支援 View 中的 View 注入
3、支援 View 事件回呼函數注入(@OnLongClick @OnFocusChanged @OnItemClick @OnItemLongClick @OnCheckedChanged等等)
今天,我們來講一下Android ButterKnife的使用,Android ButterKnife是一個專註於Android系統的View注入架構,可以減少至少一半的代碼量。
首先第一步,肯定是引用Library咯~
1、匯入butterknife-7.0.1.jar,butterknife-7.0.1.jar
我使用的AndroidStudio開發,是如果你使用的是Eclipse,那麼還需要進行下面的配置
2、右擊項目->屬性->Java Compiler → Annotation Processing ,選中"Enable project specific settings".
3、展開Annotation Processing,點擊Factory Path,選中Enable project specific settings,然後點擊Add JARs…,選中libs下的Butter Knife jar包
除了onClick外,其他事件的回呼函數綁定也是如此,就不一一詳細介紹了。配置完畢,給個例子,大家就懂了。
首先,來看看xml布局檔案,這裡只是定義簡單的幾個Button控制項
[html] view plain copy
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <Button
- android:id="@+id/btn1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-
- <Button
- android:id="@+id/btn2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-
- <Button
- android:id="@+id/btn3"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-
- <Button
- android:id="@+id/btn4"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </LinearLayout>
在Activity中,進行註解的綁定。
[html] view plain copy
- package com.newland.adsl;
-
- import android.support.design.widget.TextInputLayout;
- import android.support.v7.app.ActionBarActivity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.TextView;
- import android.widget.Toast;
-
- import butterknife.Bind;
- import butterknife.ButterKnife;
- import butterknife.OnClick;
-
-
- public class MainActivity extends ActionBarActivity {
-
- @Bind(R.id.btn1)
- Button btnOne;
-
- @Bind(R.id.btn2)
- Button btnTwo;
-
- @Bind(R.id.btn3)
- Button btnThree;
-
- @Bind(R.id.btn4)
- Button btnFour;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- ButterKnife.bind(this); // 綁定註解
- btnOne.setText("按鈕-1");
- btnTwo.setText("按鈕-2");
- btnThree.setText("按鈕-3");
- btnFour.setText("按鈕-4");
- }
-
- @OnClick(R.id.btn1) // 不帶參數
- public void btnOne() {
- Toast.makeText(MainActivity.this, "Toast comes out", Toast.LENGTH_SHORT).show();
- }
-
-
- @OnClick(R.id.btn2)// 帶有Button參數
- public void btnTwo(Button button) {
- button.setText("Hello!");
- }
-
- @OnClick({R.id.btn3, R.id.btn4}) // 同時綁定多個控制項
- public void btnThreeAndFour(Button button) {
- button.setText("World!");
- }
- }
在onCreate()裡面,setContentView()之後,一定不要忘記的是進行綁定註解
[java] view plain copy
- ButterKnife.bind(this); // 綁定註解
@Bind(R.id.btn1) 這就把下面的變數名與控制項id綁定了,就相當於執行了findViewById()
@OnClick(R.id.btn2) 這是繫結控制項的點擊事件,函數裡面執行的就是點擊事件觸發後要做的事,相當於setOnClickListener(new OnClickListener( onClick( ... ... )));
以上就是實現在Activity下的綁定,當然,在ViewHolder模式下和Fragement也可以綁定。
ViewHolder模式下綁定:
[java] view plain copy
- 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 = getLayoutInflater().inflate(R.layout.design_navigation_item, parent, false);
- holder = new ViewHolder(view);
- view.setTag(holder);
- }
- holder.name.setText("Inject");
- return view;
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public Object getItem(int position) {
- return null;
- }
-
- @Override
- public int getCount() {
- return 0;
- }
-
- class ViewHolder {
- @Bind(R.id.title)
- TextView name;
-
- public ViewHolder(View view) {
- ButterKnife.bind(this, view);
- }
- }
- }
Fragement下的綁定:
[java] view plain copy
- public class MyFragment extends Fragment {
- @Bind(R.id.button1)
- Button button1;
- @Bind(R.id.button2)
- Button button2;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment, container, false);
- ButterKnife.bind(this, view);
- // TODO Use fields...
- return view;
- }
- }
順便提一點,每個需要綁定註解的Activity都得執行ButterKnife.bind(this);如果怕忘了怎麼辦?寫個BaseActivity,繼承Activity,在BaseActivity的onCreate函數裡面進行綁定,那麼我們只要把自己寫的Activity來繼承BaseActivity就行了,當然,BaseActivity還可以實現其他一些通用的東西。
這裡要強調的一點是,如果你使用AndroidStudio直接通過build.gradle添加 compile ‘com.jakewharton:butterknife:6.1.0‘ 來引入ButterKnife的話,那麼就會有一些變動了,如下:
[java] view plain copy
- @InjectView(R.id.hello)
- TextView hello;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ButterKnife.inject(this);
- }
這就是butterknife:6.1.0和butterknife-7.0.1.jar 因為版本不同產生的區別。
Android ButterKnife注入架構