ButterKnife的簡單使用

原文鏈接:[原文鏈接:http://blog.csdn.net/donkor_/article/details/77879630]

前言:

ButterKnife是一個專注于Android系統(tǒng)的View注入框架,以前總是要寫很多findViewById來找到View對象,有了ButterKnife可以很輕松的省去這些步驟。是大神JakeWharton的力作,目前使用很廣。最重要的一點,使用ButterKnife對性能基本沒有損失,因為ButterKnife用到的注解并不是在運行時反射的,而是在編譯的時候生成新的class。項目集成起來也是特別方便,使用起來也是特別簡單。

使用:

依賴

implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

配置

//頂部
apply plugin: 'com.jakewharton.butterknife'

dependencies {
  implementation 'com.jakewharton:butterknife:10.0.0'
  annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0'
}

ButterKnife的注冊與綁定

ButterKnife使用心得與注意事項:

1、在Activity 類中綁定 :ButterKnife.bind(this);必須在setContentView();之后綁定;且父類bind綁定后,子類不需要再bind。
2、在非Activity 類(eg:Fragment、ViewHold)中綁定: ButterKnife.bind(this,view);這里的this不能替換成getActivity()。
3、在Activity中不需要做解綁操作,在Fragment 中必須在onDestroyView()中做解綁操作。
4、使用ButterKnife修飾的方法和控件,不能用private or static 修飾,否則會報錯。錯誤: @BindView fields must not be private or static. (com.zyj.wifi.ButterknifeActivity.button1)
5、setContentView()不能通過注解實現(xiàn)。(其他的有些注解框架可以)
6、使用Activity為根視圖綁定任意對象時,如果你使用類似MVC的設(shè)計模式你可以在Activity 調(diào)用ButterKnife.bind(this, activity),來綁定Controller。
7、使用ButterKnife.bind(this,view)綁定一個view的子節(jié)點字段。如果你在子View的布局里或者自定義view的構(gòu)造方法里 使用了inflate,你可以立刻調(diào)用此方法?;蛘?,從XML inflate來的自定義view類型可以在onFinishInflate回調(diào)方法中使用它。

在Activity中綁定ButterKnife:

由于每次都要在Activity中的onCreate綁定Activity,所以個人建議寫一個BaseActivity完成綁定,子類繼承即可。綁定Activity 必須在setContentView之后。使用ButterKnife.bind(this)進行綁定。代碼如下:

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.edit)
    EditText editText;

    @BindView(R.id.click)
    Button click;

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

        ButterKnife.bind(this);// 綁定
    }

    @OnClick(R.id.click)
    public void onClick(){
        Log.e("zll", "onClick: +DKJAHSLJDHAOJKHBSDKJASHJK");
        editText.setText("d,ajsgdoiuahsjildknbskajhdiua");

    }
}

在Fragment中綁定ButterKnife:

Fragment的生命周期不同于activity。在onCreateView中綁定一個Fragment時,在onDestroyView中將視圖設(shè)置為null。當(dāng)你調(diào)用bind來為你綁定一個Fragment時,Butter Knife會返回一個Unbinder的實例。在適當(dāng)?shù)纳芷冢╫nDestroyView)回調(diào)中調(diào)用它的unbind方法進行Fragment解綁。使用ButterKnife.bind(this, view)進行綁定。代碼如下:

 private Unbinder unbinder;  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
                             Bundle savedInstanceState) {  
        View view = inflater.inflate(R.layout.fragment, container, false);  
        //返回一個Unbinder值(進行解綁),注意這里的this不能使用getActivity()  
        unbinder = ButterKnife.bind(this, view);  
        return view;  
    }  

    /** 
     * onDestroyView中進行解綁操作 
     */  
    @Override  
    public void onDestroyView() {  
        super.onDestroyView();  
        unbinder.unbind();  
    }  
}  

在Adapter中綁定ButterKnife:

在Adapter的ViewHolder中使用,將ViewHolder加一個構(gòu)造方法,在new ViewHolder的時候把view傳遞進去。使用ButterKnife.bind(this, view)進行綁定,代碼如下:

public class MyAdapter extends BaseAdapter {  

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

    holder.name.setText("Donkor");  
    holder.job.setText("Android");
    // etc...  
    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);  
    }  
  }  
}  

布局內(nèi)多個控件id 注解: @BindViews()

public class MainActivity extends AppCompatActivity {  

    @BindViews({ R2.id.button1, R2.id.button2,  R2.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 ");  
    }  
}

綁定string里面array數(shù)組:@BindArray()

<resources>  
    <string name="app_name">城市</string>  

    <string-array name="city">  
        <item>北京市</item>  
        <item>天津市</item>  
        <item>哈爾濱市</item>  
        <item>大連市</item>  
        <item>香港市</item>  
    </string-array>  

</resources>  

------------------------------------------------------------------------------

public class MainActivity  extends AppCompatActivity {  

    @BindView(R2.id.button) //綁定button 控件  
    public Button button ;  

    @BindString(R2.string.app_name)  //綁定資源文件中string字符串  
    String str;  

    @BindArray(R2.array.city)  //綁定string里面array數(shù)組  
    String [] citys ;  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        //綁定activity  
        ButterKnife.bind( this ) ;  
        button.setText(citys[0]);  
    }  
}  

綁定Bitmap 資源:@BindBitmap( )

public class MainActivity extends AppCompatActivity {  

    @BindView( R2.id.imageView ) //綁定ImageView 控件  
    public ImageView imageView ;  

    @BindBitmap( R2.mipmap.bm)//綁定Bitmap 資源  
    public Bitmap bitmap ;  

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

        //綁定activity  
        ButterKnife.bind( this ) ;  

        imageView.setImageBitmap(bitmap);  
    }  
} 

事件綁定:

綁定點擊事件:

綁定控件點擊事件:@OnClick( )
綁定控件長按事件:@OnLongClick( )

public class MainActivity extends AppCompatActivity {  

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

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

    @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:當(dāng)涉及綁定多個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 ) ;  
    }  
}

更多綁定注解:

@BindView—->綁定一個view;id為一個view 變量
@BindViews —-> 綁定多個view;id為一個view的list變
@BindArray—-> 綁定string里面array數(shù)組;@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等這些有點擊的控件事件的,需要設(shè)置這些控件屬性focusable為false)
@OnItemLongClick item—->長按(返回真可以攔截onItemClick)
@OnItemSelected —->item被選擇事件
@OnLongClick —->長按事件
@OnPageChange —->頁面改變事件
@OnTextChanged —->EditText里面的文本變化事件
@OnTouch —->觸摸事件
@Optional —->選擇性注入,如果當(dāng)前對象不存在,就會拋出一個異常,為了壓制這個異常,可以在變量或者方法上加入一下注解,讓注入變成選擇性的,如果目標(biāo)View存在,則注入, 不存在,則什么事情都不做

多選

//Test @Optional
@Optional  
@OnCheckedChanged(R.id.cb_test)  
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){  
    if(isChecked){  
        tvTest.setText("被選中...");  
    }else{  
        tvTest.setText("被取消...");  
    }  
}
image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容