android注入之ButterKnife的使用
注入的話相信大家應該都是很熟悉的,他不僅把程式碼的結構簡潔化,還能減少很大一部分的findviewByid的程式碼量 ,但是平時看到的注入都是封裝在一個大的框架中的,比如xUtils,這裡我們來介紹下一個獨立的小框架 .jar包的下載地址 (這裡說的是5.0的包)
1.配置Eclipse
在使用ButterKnife需要先配置一下Eclipse。
專案右鍵-Properties-Java Complier-Annotation Processing 確保設定和下圖一致
接著展開Annotation Processing選擇Factory Path,選中Enable project specific settings。然後點選 Add JARs…,選中ButterKnife的jar包
然後點選ok儲存設定,Eclipse將問你是否重新構建新專案,點選Yes。
確保你專案的根目錄裡有一個.apt_generated的資料夾,資料夾中包含YOURACTIVITY$$ViewInjector.java這樣的檔案。

2 使用註解
2.1 在Activity中使用註解
1
2
3
4
5
6
7
8
9
10
11
12
|
class ExampleActivity extends Activity { @InjectView(R.id.title) TextView title; @InjectView(R.id.subtitle) TextView subtitle; @InjectView(R.id.footer) TextView footer; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.simple_activity); ButterKnife.inject( this ); // TODO Use "injected" views... } } |
2.2 Fragment中使用註解
1
2
3
4
5
6
7
8
9
10
11
|
public class FancyFragment extends Fragment { @InjectView(R.id.button1) Button button1; @InjectView(R.id.button2) Button button2; @Override View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fancy_fragment, container, false ); ButterKnife.inject( this , view); // TODO Use "injected" views... return view; } } |
2.3 Adapter中使用註解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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 convertView; } static class ViewHolder { @InjectView(R.id.title) TextView name; @InjectView(R.id.job_title) TextView jobTitle; public ViewHolder(View view) { ButterKnife.inject( this , view); } } } |
2.4事件注入
點選事件注入
1
2
3
4
|
@OnClick(R.id.submit) public void sayHi(Button button) { button.setText( "Hello!" ); } |
多個控制元件具有相同的事件
1
2
3
4
5
6
7
8
|
@OnClick({ R.id.door1, R.id.door2, R.id.door3 }) public void pickDoor(DoorView door) { if (door.hasPrizeBehind()) { Toast.makeText( this , "You win!" , LENGTH_SHORT).show(); } else { Toast.makeText( this , "Try again" , LENGTH_SHORT).show(); } } |
2.5重置注入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class FancyFragment extends Fragment { @InjectView(R.id.button1) Button button1; @InjectView(R.id.button2) Button button2; @Override View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fancy_fragment, container, false ); ButterKnife.inject( this , view); // TODO Use "injected" views... return view; } @Override void onDestroyView() { super .onDestroyView(); ButterKnife.reset( this ); } } |
2.6 可選注入
預設情況下@InjectView
和@OnClick
注入是必選的,如果view未找到將出現異常。為了避免出現異常,新增一個@Optional
註解。
2.7其它
ButterKnife還包含了兩個findById方法。
1
2
3
4
|
View view = LayoutInflater.from(context).inflate(R.layout.thing, null ); TextView firstName = ButterKnife.findById(view, R.id.first_name); TextView lastName = ButterKnife.findById(view, R.id.last_name); ImageView photo = ButterKnife.findById(view, R.id.photo); |
3 混淆
為避免混淆的時程式碼被移除,所以要在proguard-project.txt中新增如下程式碼避免混淆
1
2
3
|
-dontwarn butterknife.internal.** -keep class **$$ViewInjector { *; } -keepnames class * { @butterknife.InjectView *;} |
擴充套件閱讀
版本7.0.0中,現在註解已經不叫@InjectView了,而叫@Bind,感覺更貼合語義。同時註冊的方式也從
ButterKnife.inject(this);
變成了
ButterKnife.bind(this);
關於7.0.0的ButterKnife的各種用法和功能,可以參考ButterKnife的github上的主頁:
http://jakewharton.github.io/butterknife/
注,在windows下,某些eclipse版本無法選擇 Compiler/Annotation Processing"。下面是兩個版本的比較。
adt-bundle-windows-x86_64-20140702 (較新的版本,不可以)
adt-bundle-windows-x86_64-20131030 (2013年的版本,可以)
原因是谷歌在bundled版本中移除了Annotation Processing 選項,目的是為了鎖定到他們自己新出的註解系統中: /extras/android/support/annotations/android-support-annotations.jar
github上的解決辦法是安裝如下圖所示的東西:
當然換成android studio應該更好解決
可以讓你在新增Butterkinfe註解時偷偷懶,直接點選幾下滑鼠既可以完成註解的增加,同時還是圖形化的操作,可以說,大大的減輕了開發負擔。尤其是當你的layout中有很多很多的view需要通過findviewbyid來獲得引用時。實際上如果不用這個外掛而通過手打加ButtefKnife註解的方式,要是view很多啟示也挺麻煩的,不是嗎?
首先看看如何在Android Studio上安裝該外掛,直接看圖:
安裝好後需要restart你的Android Studio。
在使用此外掛前,需要已經匯入了butterknife的jar(或者在build.gradle中已經加入:compile'com.jakewharton:butterknife:7.0.0')
隨後,在你需要匯入註解的Activity或者Fragment或者ViewHolder的layout資原始碼上,右擊,選擇 Generate
然後Generate ButterKnife Injections,這時候生成類似於下列的選擇框:
Element為view的型別,ID為layout中資源的id名字,Variable Name即為你在程式碼中引用出來的變數名,點選Confirm後即可。(具體的操作還可以檢視http://blog.csdn.net/cxc19890214/article/details/47430547)
下面是Android ButterKnife Zelezny的github上的一個動態使用流程圖:
相關文章
- Android Studio中的外掛ButterKnife的配置及其使用方法Android
- Android Studio ButterKnife Zelezny 安裝注意點Android
- Android之adb的使用Android
- 記一次元件化開發中使用ButterKnife的使用元件化
- 程式注入之DLL注入
- sql注入之union注入SQL
- Android大變天,是時候和ButterKnife說再見了!Android
- Android多程式之Binder的使用Android
- Android多程式之Messenger的使用AndroidMessenger
- Android 多程式之Messenger的使用AndroidMessenger
- ButterKnife原始碼解析原始碼
- Butterknife(10.0.0):Manifest merger failed的坑AI
- Android 之Service使用攻略Android
- Android自定義View之Canvas的使用AndroidViewCanvas
- sql注入之堆疊注入及waf繞過注入SQL
- SpringBoot基礎篇Bean之條件注入之註解使用Spring BootBean
- sql注入之型別及提交注入SQL型別
- Android_Jetpack:Paging元件之BoundaryCallback的使用AndroidJetpack元件
- Java之JNDI注入Java
- IOC注入技術之編譯時注入編譯
- 手機抓包+注入黑科技HttpCanary——最強大的Android抓包注入工具HTTPPCAAndroid
- 選擇ButterKnife,告別findViewByIdView
- Android Room2.0之@TypeConverters使用AndroidOOM
- Android Jetpack 之Navigation Architecture Component使用AndroidJetpackNavigation
- Java安全之JNDI注入Java
- 技術分享 | DLL注入之遠執行緒注入執行緒
- SpringBoot基礎篇Bean之條件注入@Condition使用姿勢Spring BootBean
- IceRPC之依賴注入>快樂的RPCRPC依賴注入
- Solon Ioc 的魔法之註解注入器(也可叫虛空注入器)
- iOS逆向之 程式碼注入iOS
- Tomcat Filter之動態注入TomcatFilter
- Sql注入之WAF繞過SQL
- Feign 注入失敗之坑
- O3-開源框架使用之Butterknife 8.8.1及原始碼淺析框架原始碼
- Android UI美化之 shape的使用及其屬性總結AndroidUI
- Android 反編譯初探 應用是如何被注入廣告的Android編譯
- 驅動注入使用者執行緒之跨session通知csrss之真正解決執行緒Session
- Android耗電分析之Battery Historian工具使用AndroidBAT
- Spring 原始碼分析之 bean 依賴注入原理(注入屬性)Spring原始碼Bean依賴注入