Android ButterKnife(黃油刀)的使用

首語

  • 在android開發過程中,我們會寫大量的佈局和點擊事件,像findViewById、設置view監聽這樣簡單而重複的操作讓人覺得麻煩,而ButterKnife是註解中相對簡單易懂的很不錯的開源框架。

優勢

  • 強大的View綁定和Click事件處理功能,簡化代碼,提升開發效率。
  • 方便的處理Adapter裏的ViewHolder綁定問題。
  • 運行時不會影響APP效率,使用配置方便。
  • 代碼清晰,可讀性強。

GitHub地址:https://github.com/JakeWharton/butterknife

ButterKnife基本使用

使用步驟

1.在Setting->Plugins中輸入butterknife——>添加插件Android ButterKnife Aelezny ——>點擊安裝。
2.dependencies中添加依賴:

implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor "com.jakewharton:butterknife-compiler:8.8.1"
ButterKnife使用心得
  • 在Activity類中綁定,ButterKnife.bind(this);必須在setContentView();之後綁定;且父類bind綁定後,子類不需要再bind。
  • 在非Activity 類(eg:Fragment、ViewHold)中綁定: ButterKnife.bind(this,view);這裏的this不能替換成getActivity()。
  • 在Activity中不需要做解綁操作,在Fragment 中必須在onDestroyView()中做解綁操作。
  • 使用ButterKnife修飾的方法和控件,不能用private or static 修飾,否則會報錯。
    錯誤: @BindView fields must not be private or static. (com.zyj.wifi.ButterknifeActivity.button1)
  • setContentView()不能通過註解實現。(其他的有些註解框架可以)
  • 使用Activity爲根視圖綁定任意對象時,如果你使用類似MVC的設計模式你可以在Activity 調用ButterKnife.bind(this, activity),來綁定Controller。
  • 使用ButterKnife.bind(this,view)綁定一個view的子節點字段。如果你在子View的佈局裏或者自定義view的構造方法裏 使用了inflate,你可以立刻調用此方法。或者,從XML inflate來的自定義view類型可以在onFinishInflate回調方法中使用它。
在Activity中綁定ButterKnife
public class ButterKnifeActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_butter_knife);
        //在Activity中綁定ButterKnife
        ButterKnife.bind(this);
    }
}
在Fragment中綁定ButterKnife
public class ButterKnifeFragment extends Fragment {

    private Unbinder unbinder;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_butter_knife, container, false);
        //在Fragment中進行綁定ButterKnife,返回一個Unbinder(進行解綁),這裏的this不能用Activity
        unbinder = ButterKnife.bind(this, view);
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        //在onDestroyView中進行解綁操作
        unbinder.unbind();
    }
}
在Adapter中綁定ButterKnife
public class ButterKnifeAdapter extends BaseAdapter {

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        ViewHolder holder;
        if (view != null) {
            holder = (ViewHolder) view.getTag();
        } else {
            view = view.inflate(R.layout.testlayout, parent, false);
            holder = new ViewHolder(view);
            view.setTag(holder);
        }

        holder.name.setText("ButterKnife");
        holder.job.setText("Android");
        return view;
    }

    static class ViewHolder {
        @BindView(R.id.title)
        TextView name;
        @BindView(R.id.job)
        TextView job;

        public ViewHolder(View view) {
            ButterKnife.bind(this, view);
        }

    }
}

View綁定

  • 控件id註解
@BindView(R.id.fragment_answer_et1)
EditText et1;
@BindView(R.id.fragment_answer_et2)
EditText et2;
@BindView(R.id.fragment_answer_et3)
EditText et3;
  • 多個控件id註解
public class MainActivity extends AppCompatActivity {  

    @BindViews({ R.id.button1, R.id.button2,  R.id.button3})  
    public List<Button> buttonList ;  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  

        ButterKnife.bind(this);  

        buttonList.get( 0 ).setText( "hello 1 ");  
        buttonList.get( 1 ).setText( "hello 2 ");  
        buttonList.get( 2 ).setText( "hello 3 ");  
    }  
}  

事件綁定

  • 控件點擊事件
public class MainActivity extends AppCompatActivity {  

    @OnClick(R.id.button1 )   //給 button1 設置一個點擊事件  
    public void showToast(){  
        Toast.makeText(this, "is a click", Toast.LENGTH_SHORT).show();  
    }  

    @OnLongClick( R.id.button1 )    //給 button1 設置一個長按事件  
    public boolean showToast2(){  
        Toast.makeText(this, "is a long click", Toast.LENGTH_SHORT).show();
    }  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        //綁定activity  
        ButterKnife.bind( this ) ;  
    }  
}  
  • 多個id綁定事件
public class MainActivity extends AppCompatActivity {  

    //Tip:當涉及綁定多個id事件時,我們可以使用Android studio的Butterknife
    //插件zelezny快速自動生成
    @OnClick({R.id.ll_product_name, R.id.ll_product_lilv, R.id.ll_product_qixian, R.id.ll_product_repayment_methods})  
    public void onViewClicked(View view) {  
        switch (view.getId()) {  
            case R.id.ll_product_name:  
                System.out.print("我是點擊事件1");  
                break;  
            case R.id.ll_product_lilv:  
                System.out.print("我是點擊事件2");  
                break;  
            case R.id.ll_product_qixian:  
                System.out.print("我是點擊事件3");  

                break;  
            case R.id.ll_product_repayment_methods:  
                System.out.print("我是點擊事件4");  
                break;  
        }  
    }  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        //綁定activity  
        ButterKnife.bind( this ) ;
  • 省略setOnClickListener()
@OnClick(R.id.basic_finish_a_button)
    void finishA(View view) {
        finish();
    }//方法不能被private或public修飾,並且有一個參數
ButterKnife.inject(this);
  • ListView的點擊@OnItemClick, CheckBox的@OnCheckedChanged也可以實現省略操作。

更多綁定註解

  • @BindView—->綁定一個view;id爲一個view 變量
  • @BindViews —-> 綁定多個view;id爲一個view的list變量
  • @BindArray—-> 綁定string裏面array數組;@BindArray(R.array.city ) String[] citys ;
  • @BindBitmap—->綁定圖片資源爲Bitmap;@BindBitmap( R.mipmap.wifi ) Bitmap bitmap;
  • @BindBool —->綁定boolean值
  • @BindColor —->綁定color;@BindColor(R.color.colorAccent) int black;
  • @BindDimen —->綁定Dimen;@BindDimen(R.dimen.borth_width) int mBorderWidth;
  • @BindDrawable —-> 綁定Drawable;@BindDrawable(R.drawable.test_pic) Drawable mTestPic;
  • @BindFloat —->綁定float
  • @BindInt —->綁定int
  • @BindString —->綁定一個String id爲一個String變量;@BindString( R.string.app_name ) String meg;

更多事件註解

  • @OnClick—->點擊事件
  • @OnCheckedChanged —->選中,取消選中
  • @OnEditorAction —->軟鍵盤的功能鍵
  • @OnFocusChange —->焦點改變
  • @OnItemClick item—->被點擊(注意這裏有坑,如果item裏面有Button等這些有點擊的控件事件的,需要設置這些控件屬性focusable爲false)
  • @OnItemLongClick item—->長按(返回真可以攔截onItemClick)
  • @OnItemSelected —->item被選擇事件
  • @OnLongClick —->長按事件
  • @OnPageChange —->頁面改變事件
  • @OnTextChanged —->EditText裏面的文本變化事件
  • @OnTouch —->觸摸事件
  • @Optional —->選擇性注入,如果當前對象不存在,就會拋出一個異常,爲了壓制這個異常,可以在變量或者方法上加入一下註解,讓注入變成選擇性的,如果目標View存在,則注入, 不存在,則什麼事情都不做。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章