ButterKnife入門教程

版權全部,轉載請註明出處:linzhiyong https://www.jianshu.com/p/b1fc5b0e9e87 https://blog.csdn.net/u012527802/article/details/81059568android

目錄

  1. ButterKnife
  2. ButterKnife是什麼,看一下Github上做者JakeWharton大神的介紹
  3. AndroidStudio集成ButterKnife插件和依賴
    3.1 插件集成
    3.2 添加依賴
  4. 開始使用
    4.1 13種綁定註解說明
    4.2 事件註解說明
    4.3 在Activity中使用
    4.4 在Fragment中使用
    4.5 在ViewHolder中使用
    4.6 綁定View
    4.6.1 手動綁定
    4.6.2 快捷鍵(插件)綁定
    4.7 綁定Drabable、Anim、Bitmap、String、Array、Dimen、Color
    4.8 綁定事件(點擊、選擇、長按、觸摸等等事件)

1. ButterKnife

ButterKnife是一個輕量級的註解框架,做用於Android視圖的字段和方法、資源的綁定。本文只作一些基本的舉例,讓沒接觸過ButterKnife的同窗能夠簡單粗暴的上手。
Github:https://github.com/JakeWharton/butterknife
ButterKnifeDemo傳送門:https://github.com/linzhiyong/ButterKnifeDemogit

2. ButterKnife是什麼,看一下Github上做者JakeWharton大神的介紹

Field and method binding for Android views which uses annotation processing to generate boilerplate code for you.github

  1. Eliminate findViewById calls by using @BindView on fields.
  2. Group multiple views in a list or array. Operate on all of them at once with actions, setters, or properties.
  3. Eliminate anonymous inner-classes for listeners by annotating methods with @OnClick and others.
  4. Eliminate resource lookups by using resource annotations on fields.

Android視圖的字段和方法綁定,使用註釋處理生成樣板代碼。數組

  1. 在字段上使用@BindView消除findViewById調用。
  2. 將列表或數組中的多個視圖分組。 使用操做,設置器或屬性一次操做全部這些操做。
  3. 經過使用@OnClick和其餘方法註釋方法來消除偵聽器的匿名內部類。
  4. 經過在字段上使用資源註釋來消除資源查找。

3. AndroidStudio集成ButterKnife插件和依賴

3.1 插件集成

AndroidStudio -> File -> Settings -> Plugins -> Browse repositories -> 搜索ButterKnife,找到Android ButterKnife Zeleany點擊Install,重啓AndroidStudio 。 bash

插件集成圖解

3.2 添加依賴

在build.gradle文件中添加:app

dependencies {
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}
複製代碼

若是是在Library中使用ButterKnife,則須要在項目根目錄下的build.gradle中添加:框架

buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'
  }
}
複製代碼

同時修改Libirary下的build.gradlemaven

apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'
複製代碼

4 開始使用

4.1 13種綁定註解說明

註解名稱 註解說明
@BindView 綁定一個view,@BindView(R.id.listView1) ListView listView;
@BindViews 綁定多個view,@BindViews({R.id.textView1, R.id.textView2}) List viewList
@BindAnim 綁定一個動畫資源,@BindAnim(R.anim.anim_translate_1) Animation animation
@BindArray 綁定res/string.xml下的array數組,@BindArray(R.array.list) String[] array
@BindBitmap 綁定圖片資源爲Bitmap,@BindBitmap( R.mipmap.ic_launcher ) Bitmap iconBitmap
@BindBool 綁定boolean
@BindColor 綁定color,@BindColor(R.color.colorAccent) int colorAccent
@BindDimen 綁定Dimen,@BindDimen(R.dimen.width) int width
@BindDrawable 綁定Drawable@BindDrawable(R.drawable.ic_launcher_background) Drawable drawable
@BindFloat 綁定float
@BindFont 綁定font
@BindInt 綁定int
@BindString 綁定一個String,@BindString( R.string.app_name ) String appName

4.2 事件註解說明

註解名稱 註解說明
@OnCheckedChanged CheckBox 選中、取消選中事件綁定
@OnClick view點擊事件
@OnEditorAction 軟鍵盤的功能鍵
@OnFocusChange EditText等 焦點改變事件
@OnItemClick ListView、GridView等組件item點擊事件
@OnItemLongClick ListView、GridView等組件item長按事件,返回類型boolean型,返回true能夠攔截onItemClick
@OnItemSelected Spinner item選擇事件
@OnLongClick view 長按事件
@OnPageChange ViewPager 頁面改變事件
@OnTextChanged EditText 文本變化事件
@OnTouch view 觸摸事件
@Optional 可選綁定,默認狀況下,@bind和監聽器綁定都必須有一個目標view,當butter knife找不到對應的view時會拋出一個異常。爲了防止這種異常狀況的發生,能夠在綁定的字段前面使用@Nullable註解,在綁定的方法前面則可以使用@Option註解,來代表對應的是一個可選綁定。

4.3 在Activity中使用

private Unbinder unbinder;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    unbinder = ButterKnife.bind(this); // 返回一個Unbinder對象
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (unbinder != null) {
        unbinder.unbind();
    }
}
複製代碼

4.4 在Fragment中使用

public class HomeFragment extends Fragment {

    private Unbinder unbinder;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_main, container, false);
        unbinder = ButterKnife.bind(this, view);
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (unbinder != null) {
            unbinder.unbind();
        }
    }
}
複製代碼

4.5 在ViewHolder中使用

final class ViewHolder {

    @BindView(R.id.nameView)
    TextView nameView;

    @BindView(R.id.ageView)
    TextView ageView;

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

}
複製代碼

4.6 綁定View

4.6.1 手動綁定

// 綁定多view
@BindViews({R.id.textView1, R.id.textView2, R.id.textView3})
List<TextView> viewList;

// 單個綁定
@BindView(R.id.editText1)
EditText editText;

@BindView(R.id.listView1)
ListView listView;
複製代碼

4.6.2 快捷鍵(插件)綁定

鼠標選中R.layout.XXX -->> 右鍵 -->> 選擇Generate -->> 選擇Generate ButterKnife Injections -->> confirm完成ide

1

2

3

4.7 綁定Drabable、Anim、Bitmap、String、Array、Dimen、Color

@BindString(R.string.app_name)
String appName;

@BindArray(R.array.list)
String[] array;

@BindBitmap(R.mipmap.ic_launcher)
Bitmap icon;

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

@BindDimen(R.dimen.width)
int width;

@BindAnim(R.anim.anim_translate_1)
Animation translateAnimation;
複製代碼

4.8 綁定事件(點擊、選擇、長按、觸摸等等事件)

// 綁定單個按鈕
@OnClick(R.id.button1)
public void onClick(View view) {
    showToast("點擊了按鈕:" + view.toString());
}

// 綁定多個按鈕
@OnClick({R.id.button1, R.id.button2, R.id.button3})
public void onClickEx(View view) {
    switch (view.getId()) {
        case R.id.button1:
            break;

        case R.id.button2:
            break;

        case R.id.button3:
            break;
    }
}

@OnTouch(R.id.textView1)
public boolean onTouch(View view) {
    showToast("touch:" + view.toString());
    return true;
}

@OnFocusChange(R.id.editText1)
public void onFocusChange(View view, boolean flag) {
    showToast("焦點改變...");
}

@OnItemClick(R.id.listView1)
public void onItemClickListener(int position) {
    showToast("ListView點擊位置:" + position);
}

@OnItemLongClick(R.id.listView1)
public boolean onItemLongClickListener(int position) {
    showToast("ListView長按位置:" + position);
    return true;
}

@OnItemSelected(R.id.spinner1)
public void onItemSelectedClickListener(int position) {
    showToast("Spinner選擇位置:" + position);
}

@OnItemSelected(value = R.id.spinner1, callback = OnItemSelected.Callback.NOTHING_SELECTED)
public void onNothingSelectedClickListener() {
    showToast("Spinner未選擇item");
}
複製代碼
相關文章
相關標籤/搜索