Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android注入之ButterKnife的使用

android注入之ButterKnife的使用

編輯:關於Android編程

注入的話相信大家應該都是很熟悉的,他不僅把代碼的結構簡潔化,還能減少很大一部分的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 classExampleActivityextendsActivity{ @InjectView(R.id.title)TextViewtitle; @InjectView(R.id.subtitle)TextViewsubtitle; @InjectView(R.id.footer)TextViewfooter; @OverridepublicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.simple_activity); ButterKnife.inject(this); //TODOUse"injected"views... } }

2.2 Fragment中使用注解

1 2 3 4 5 6 7 8 9 10 11 publicclassFancyFragmentextendsFragment{ @InjectView(R.id.button1)Buttonbutton1; @InjectView(R.id.button2)Buttonbutton2; @OverrideViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){ Viewview=inflater.inflate(R.layout.fancy_fragment,container,false); ButterKnife.inject(this,view); //TODOUse"injected"views... returnview; } }

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 publicclassMyAdapterextendsBaseAdapter{ @OverridepublicViewgetView(intposition,Viewview,ViewGroupparent){ ViewHolderholder; if(view!=null){ holder=(ViewHolder)view.getTag(); }else{ view=inflater.inflate(R.layout.whatever,parent,false); holder=newViewHolder(view); view.setTag(holder); } holder.name.setText("JohnDoe"); //etc... returnconvertView; } staticclassViewHolder{ @InjectView(R.id.title)TextViewname; @InjectView(R.id.job_title)TextViewjobTitle; publicViewHolder(Viewview){ ButterKnife.inject(this,view); } } }

2.4事件注入

 

點擊事件注入

1 2 3 4 @OnClick(R.id.submit) publicvoidsayHi(Buttonbutton){ button.setText("Hello!"); }

多個控件具有相同的事件

1 2 3 4 5 6 7 8 @OnClick({R.id.door1,R.id.door2,R.id.door3}) publicvoidpickDoor(DoorViewdoor){ if(door.hasPrizeBehind()){ Toast.makeText(this,"Youwin!",LENGTH_SHORT).show(); }else{ Toast.makeText(this,"Tryagain",LENGTH_SHORT).show(); } }

2.5重置注入

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 publicclassFancyFragmentextendsFragment{ @InjectView(R.id.button1)Buttonbutton1; @InjectView(R.id.button2)Buttonbutton2; @OverrideViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){ Viewview=inflater.inflate(R.layout.fancy_fragment,container,false); ButterKnife.inject(this,view); //TODOUse"injected"views... returnview; } @OverridevoidonDestroyView(){ super.onDestroyView(); ButterKnife.reset(this); } }

2.6 可選注入

默認情況下@InjectView@OnClick注入是必選的,如果view未找到將出現異常。為了避免出現異常,添加一個@Optional注解。

2.7其它

ButterKnife還包含了兩個findById方法。

1 2 3 4 Viewview=LayoutInflater.from(context).inflate(R.layout.thing,null); TextViewfirstName=ButterKnife.findById(view,R.id.first_name); TextViewlastName=ButterKnife.findById(view,R.id.last_name); ImageViewphoto=ButterKnife.findById(view,R.id.photo);

3 混淆

為避免混淆的時代碼被移除,所以要在proguard-project.txt中添加如下代碼避免混淆

1 2 3 -dontwarnbutterknife.internal.** -keepclass**$$ViewInjector{*;} -keepnamesclass*{@butterknife.InjectView*;}

擴展閱讀

Butterknife

Butterknife中文

版本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很多啟示也挺麻煩的,不是嗎?

 

首先看看如何在AndroidStudio上安裝該插件,直接看圖:

 

安裝好後需要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後即可。

 

下面是Android ButterKnifeZelezny的github上的一個動態使用流程圖:

\


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved