Android開發-ButterKnife的導入與使用

ButterKnife介紹

ButterKnife,俗稱黃油刀,在Android開發經常使用的一個專注於Android系統的View注入框架,簡短findViewById來獲取View對象的代碼長度是它的功能之一,此外它還可以縮減監聽事件的長度,並對其性能影響不大,但編譯時間會有所加長,不過你是感受不出來的
GitHub地址:https://github.com/JakeWharton/butterknife
官方文檔:http://jakewharton.github.io/butterknife/

ButterKnife原理

ButterKnife主要採用編譯時註解,就是用 apt 生成代碼,詳細解釋:ButterKnife 原理

ButterKnife 依賴添加

這裏我們介紹在Java中添加ButterKnife依賴和在kotlin中添加ButterKnife依賴,適用於Android X庫

Java中添加依賴

在你的build.gradle(module:app)中的dependencies{ }裏添加如下兩條語句:

 //引入ButterKnife
    implementation "com.jakewharton:butterknife:10.0.0"
    annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'

kotlin中添加依賴

同樣在如上相同的文件中,加入以下兩條語句

    implementation 'com.jakewharton:butterknife:10.2.1'
    kapt 'com.jakewharton:butterknife-compiler:10.2.1'

ButterKnife 插件的安裝

打開Android studio,點擊File 》》Settings》》Plugins》》Marketplace中搜索ButterKnife
在這裏插入圖片描述
點擊安裝後,需要重啓Android studio,纔會啓用

ButterKnife 插件的使用

首先在你的資源文件中設置ID

android:id="@+id/id"

然後在activity中引用該資源文件

setContentView(R.layout.activity_main);

將光標放在綁定視圖的括號中,右鍵如圖操作:
在這裏插入圖片描述
勾選onclick,還可以自動生成點擊事件

@OnClick({R.id.main_page_container, R.id.main_bottn})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.main_page_container:
                break;
            case R.id.main_bottn:
                break;
        }
    }

ButterKnife在不同場景中綁定

Activity裏在onCreate方法中加入ButterKnife.bind(this)

public class MainActivity extends AppCompatActivity{  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        //綁定初始化ButterKnife  
        ButterKnife.bind(this);  
    }  
}  

Fragment中先使用inflater返回一個view,再使用ButterKnife.bind(this, view)綁定即可,注意:你需要在適當的時候對其進行解綁

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, container, false);  
        //返回一個Unbinder值(進行解綁),注意這裏的this不能使用getActivity()  
        unbinder = ButterKnife.bind(this, view);  
        return view;  
    }  

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

Adapter的ViewHolder中使用,將ViewHolder加一個構造方法,在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 != null) {  
      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);  
    }  
  }  
}  

ButterKnife的基本使用

綁定VIEW

單個控件id註解

 @BindView(R.id.main_bottn)
 BottomNavigationView mbottomNavigationView;

佈局內多個控件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 ");  
    }  
}  

綁定資源

綁定圖片資源爲Bitmap:

@BindBitmap( R.mipmap.wifi )
 Bitmap bitmap;

綁定一個String 資源爲一個String變量及數組

綁定string裏面array數組:
```java
<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數組  
    String [] citys ;  

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

綁定color 資源爲一個int變量:

@BindColor(R.color.colorAccent) 
int black;

綁定Dimen資源:

@BindDimen(R.dimen.borth_width)
 int mBorderWidth;

綁定Drawable

@BindDrawable(R.drawable.test_pic) 
Drawable mTestPic;

綁定不同類型的資源

綁定Int類型

@BindInt(R.int.columns)
int columns;

綁定Bool類型

@BindBool(R.bool.is_tablet)
boolean isTablet;

綁定Float類型

// 可綁定 float 類型的 dimen 資源
@BindFloat(R.dimen.image_ratio)
float imageRatio;

綁定事件

綁定點擊事件

綁定單個OnClick和OnLongClick事件

public class MainActivity extends AppCompatActivity {  

    @OnClick(R.id.button1)
    public void onViewClicked() {
          Toast.makeText(this, "這是綁定的點擊事件", Toast.LENGTH_SHORT).show();  
    }

    @OnLongClick( R1.id.button1 )    //給 button1 設置一個長按事件  
    public boolean onViewClickeds(){  
        Toast.makeText(this, "這是綁定的長按事件", Toast.LENGTH_SHORT).show();  
        return true ;  
    }  

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

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

綁定多個點擊事件

  @OnClick({R.id.button1, R.id.main_button2})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.button1:
                break;
            case R.id.main_button2:
                break;
        }
    }

綁定選擇事件

在RadioGroup+RadioButton中使用OnCheckedChanged事件綁定

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical">  

    <RadioGroup  
        android:id="@+id/rg_main"  
        android:layout_width="fill_parent"  
        android:layout_height="48dp"  
        android:layout_alignParentBottom="true"  
        android:background="@color/white"  
        android:orientation="horizontal">  

        <RadioButton  
            android:id="@+id/rg_home"  
            android:layout_width="match_parent"  
            android:layout_height="match_parent"  
            android:focusable="false"  
            android:text="@string/nav_one" />  

        <RadioButton  
            android:id="@+id/rg_wealth"  
            android:layout_width="match_parent"  
            android:layout_height="match_parent"  
            android:focusable="false"  
            android:text="@string/nav_two" />  

        <RadioButton  
            android:id="@+id/rg_account"  
            android:layout_width="match_parent"  
            android:layout_height="match_parent"  
            android:focusable="false"  
            android:text="@string/nav_four" />  
    </RadioGroup>  

</LinearLayout>  

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

@OnCheckedChanged({R.id.rg_home,R.id.rg_wealth,R.id.rg_account})  
    public void OnCheckedChangeListener(CompoundButton view, boolean ischanged ){  
        switch (view.getId()) {  
            case R.id.rg_home:  
                if (ischanged){//注意:這裏一定要有這個判斷,只有對應該id的按鈕被點擊了,ischanged狀態發生改變,纔會執行下面的內容  
                    //這裏寫你的按鈕變化狀態的UI及相關邏輯  
                }  
                break;  
            case R.id.rg_wealth:  
                if (ischanged) {  
                    //這裏寫你的按鈕變化狀態的UI及相關邏輯  
                }  
                break;  
            case R.id.rg_account:  
                if (ischanged) {  
                    //這裏寫你的按鈕變化狀態的UI及相關邏輯  
                }  
                break;  
            default:  
                break;  
        }  
    }  

綁定頁面改變事件

這個在viewpager中使用

@OnPageChange(R.id.viewpager)
public void onPageSelected(int position) {
        switch (position) {
            case 0:

                break;
            case 1:

                break;
        }
    }

其他事件

註解 用處
@OnEditorAction 軟鍵盤的功能鍵
@OnFocusChange 焦點改變
@OnItemClick item 被點擊(注意這裏有坑,如果item裏面有Button等這些有點擊的控件事件的,需要設置這些控件屬性focusable爲false)
@OnItemLongClick item 長按(返回真可以攔截onItemClick)
@OnItemSelected item被選擇事件
@OnTextChanged EditText裏面的文本變化事件
@Optional 選擇性注入,如果當前對象不存在,就會拋出一個異常,爲了壓制這個異常,可以在變量或者方法上加入一下註解,讓注入變成選擇性的,如果目標View存在,則注入, 不存在,則什麼事情都不做

借鑑

Android Butterknife(黃油刀) 使用方法總結
ButterKnife使用方法詳解
ButterKnife 的簡單使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章