ButterKnife,資源注入如此簡單

安卓基礎開發庫,讓開發簡單點。
DevRing & Demo地址https://github.com/LJYcoder/DevRing

學習/參考地址:
http://www.lxweimin.com/p/9ad21e548b69
http://www.cnblogs.com/zhaoyanjun/p/6016341.html

前言

ButterKnife是一個資源綁定框架,它使用注解來進行資源綁定、監聽事件綁定的操作,可以幫我們省去findViewById、setXXXListener等繁瑣的代碼。使用方便,不影響性能(編譯時就生成相應文件),提高開發效率。


介紹

下面從 配置、使用、插件、混淆 這幾個部分來介紹。

1. 配置

在Module下的build.gradle中添加

//ButterKnife注入
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

2. 使用

使用流程可以分成 設置資源綁定、設置監聽綁定、開啟綁定

2.1 設置資源綁定

2.1.1綁定視圖 @BindView( ) / @BindViews( )

  • 使用@BindView( )綁定單個視圖
@BindView(R.id.rv_collect)
RecyclerView mRvCollect;
  • 使用@BindViews( )綁定一組視圖
    bindviews設置屬性
@BindViews({ R2.id.tv_name, R2.id.tv_age,  R2.id.tv_introduce })  
List<TextView> buttonList ;  

另外,ButterKnife提供了apply方法,可對一組視圖進行操作。
1)對一組視圖進行操作(不傳值)

ButterKnife.apply(@NonNull List< T> list, @NonNull Action< ? super T> action)
@BindViews({ R2.id.tv_name, R2.id.tv_age,  R2.id.tv_introduce })  
List<TextView> listTv;  

//統一把文字顏色設為紅色
ButterKnife.Action<TextView> SET_COLOR =new ButterKnife.Action<TextView>() {
    @Override
    public void apply(@NonNull TextView textView, int index) {
        textView.setTextColor(Color.RED);
    }
};

ButterKnife.apply(listTv, SET_COLOR);

2)對一組視圖進行操作(傳值)

ButterKnife.apply(@NonNull List<T> list, @NonNull Setter<? super T, V> setter, V value)
@BindViews({ R2.id.tv_name, R2.id.tv_age,  R2.id.tv_introduce })  
List<TextView> listTv;  

List<String> listTitle= Arrays.asList(new String[]{"姓名","年齡","介紹"});
//按順序取出標題寫入TextView
ButterKnife.Setter<TextView, List<String>> SET_TEXT = new ButterKnife.Setter<TextView, List<String>>() {
    @Override
    public void set(@NonNull TextView textView, List<String> listTitle, int index) {
        textView.setText(listTitle.get(index));
    }
};

ButterKnife.apply(listTv, SET_TEXT, listTitle);

3)對一組視圖的Property屬性進行操作

ButterKnife.apply(listTv, View.ALPHA, 0.3f);

2.1.2 綁定字符串 @BindString( ) / @BindArray( )

  • 使用BindString( )綁定單個字符串資源
@BindString(R.string.tip)
String tip;
  • 使用@BindArray( )綁定一組字符串資源
@BindArray(R.array.tips)
String[] tips ;

2.1.3 綁定顏色值 @BindColor( )

@BindColor(R.color.theme)
int themeColor;

2.1.4 綁定圖片 @BindBitmap( )

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

2.1.5 注意

  1. 使用注解聲明的資源變量,不能用private或static修飾,否則會保錯。
  2. 當指定資源id對應的View找不到時,會拋出異常,可以加多個@Nullable注解來聲明變量,以防止崩潰(建議使用Android注解庫“support-annotations”中的@Nullable)


2.2 設置監聽綁定

定義一個方法,用相關注解進行監聽事件的綁定,

2.2.1 點擊事件 @OnClick( )

@OnClick(R.id.btn1)  
public void show1(){  
    Toast.makeText(this, "onClick", Toast.LENGTH_SHORT).show();  
} 

2.2.2 長按事件 @OnLongClick( )

@OnLongClick(R.id.btn2)  
public void show2(){  
    Toast.makeText(this, "onLongClick", Toast.LENGTH_SHORT).show();  
} 

2.2.3 多個控件綁定一個事件

以onclick事件舉例。
方法可以定義適當的參數,它將會被自動轉化。

@OnClick( {R.id.btn1, R.id.btn2, R.id.btn3, R.id.btn4} )  
public void onViewClicked(View view) {  
    switch (view.getId()) {  
        case R.id.btn1:  
            Toast.makeText(this, "onclick1", Toast.LENGTH_SHORT).show();  
            break;  
        case R.id.btn2:  
            Toast.makeText(this, "onclick2", Toast.LENGTH_SHORT).show();  
            break;  
        case R.id.btn3:  
            Toast.makeText(this, "onclick3", Toast.LENGTH_SHORT).show();  
            break;  
        case R.id.btn4:  
            Toast.makeText(this, "onclick4", Toast.LENGTH_SHORT).show();   
            break;  
    }  
}  

2.2.4 其他事件

除了點擊事件和長按事件,ButterKnife還提供了很多點擊事件,比如
@OnCheckedChanged(),
@OnEditorAction(),
@OnFocusChange(),
@OnItemClick(),
@OnItemLongClick(),
@OnItemSelected(),
@OnPageChange() 等

2.2.5 注意

  1. 使用注解聲明的監聽方法,不能用private或static修飾,否則會保錯。
  2. 當指定資源id對應的View找不到時,會拋出異常,可以加多個@Optional注解來聲明方法,以防止崩潰


2.3 開啟綁定

設置完資源綁定和監聽事件綁定后,需要通過ButterKnife.bind()方法開啟綁定,調用該方法后,對應的資源和監聽事件就會開始進行注入綁定。

2.3.1 在Activity中開啟綁定

@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main);  
    //在setContentView后調用
    ButterKnife.bind(this);  
}  

2.3.2 在Fragment中開啟綁定

在Fragment中開啟綁定后,需要在視圖銷毀時進行解綁操作。

private Unbinder unbinder; 
 
@Override  
public View onCreateView(LayoutInflater inflater, ViewGroup container,  
                         Bundle savedInstanceState) {  
    View view = inflater.inflate(R.layout.fragment, container, false);  
    
    //返回Unbinder值用于解綁
    //這里調用的方法與Activity調用的有區別  
    unbinder = ButterKnife.bind(this, view);  
    return view;  
}  

@Override  
public void onDestroyView() {  
    super.onDestroyView();  
    //解綁
    unbinder.unbind();  
}  

2.3.3 在ViewHolder中開啟綁定

使用列表控件時,常常用到ViewHolder,可以通過以下方式進行綁定

//來自http://www.lxweimin.com/p/9ad21e548b69

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.whatever, parent, false);
            holder = new ViewHolder(view);
            view.setTag(holder);
        }

        holder.name.setText("John Doe");
        // etc...

        return view;
    }

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

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

3. 插件

zelezny插件可以快速自動生成ButterKnife綁定相關的代碼。
1.先通過Android Studio ---> Setting---> Plugins ---> Browse Responsitories ---> 搜索zelezny并下載,下載后請重啟Android Studio。


下載插件

2.右鍵R.layout.xxxx,點擊Generate--->Generate ButterKnife Injections,選擇目標View,即可生成相應的代碼。


插件使用1

插件使用2

4. 混淆

在proguard-rules.pro文件中添加以下內容進行混淆配置

#butterknife開始
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * { @butterknife.* <fields>;}
-keepclasseswithmembernames class * { @butterknife.* <methods>;}
#butterknife結束

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容