依賴注入ButterKnife
在Android開發中,需要大量的編寫初始化佈局、點選事件、監聽事件等一些簡單重複的程式碼,會無形中浪費時間和精力。而使用ButterKnife這個開源庫可以讓我們從大量的findViewById()和setOnclicktListener()中解放出來。
ButterKnife:是檢視注入中相對簡單易懂的開源框架,其優勢在於:
1. 強大的View繫結和Click事件處理功能,簡單程式碼,提高開發效率
2. 方便的處理Adapter和ViewHolder繫結問題
3. 提高APP執行效率,使用配置方便
4. 程式碼清晰,可讀性強
參考資料:
ButterKnife官網:http://jakewharton.github.io/butterknife/
在實際使用時,為了提高效率,也可以在Studio中使用外掛:Android ButterKnife Aelezny
ButterKnife使用心得:
1.ButtKnife初始化ButterKnife.bind(this)必須在setContentView()之後,所以ButterKnife不能在Application中初始化。
2.ButtKnife在Fragment和Adapter中使用時,初始化程式碼有所不同
ButterKnife.bind(this, mRootView);
3.屬性佈局不能用private or static 修飾,用public,否則會報錯
4.雖然使用ButterKnife很方便,但由於ButterKnife不是安卓原生的,所以使用時如果出錯了,Studio
報錯會很奇怪,需要耐心找。
ButterKnife使用步驟:
ButterKnife最新版本是8.4,需要編譯工具Studio24以上,所以這裡我是用了7.0的版本進行演示。其中我用到了ImageView,TextView,Button,CheckBox一些我們常用的控制元件以及ButterKnife在Fragment的使用的說明。最新8.4版本方法名有所改動,建議看官方文件,整體和原理沒什麼變動。
效果圖:
一、 在gradle檔案中進行關聯
compile 'com.jakewharton:butterknife:7.0.1' 二、按照需求設計佈局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical"> <ImageView android:layout_marginTop="30dp" android:id="@+id/imgShow" android:layout_width="200dp" android:layout_height="200dp" android:src="@mipmap/dahuangfeng" /> <TextView android:id="@+id/txtShowText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="汽車人變形" android:textSize="24sp" />
<Button android:id="@+id/btnOK" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="跳到第二個頁面" android:textSize="24sp" /> <TextView android:id="@+id/txtShowMessage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="我來顯示資訊" android:textSize="24sp" /><CheckBox android:id="@+id/chbShow"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp"
android:text="點我一下試試"
android:textSize="20sp" />
</LinearLayout>
完成效果:
三、在onCreate裡進行初始化(注意不同的版本初始化的方法皆不一樣,且註解控制元件的字尾名都不同
ButterKnife.bind(this); 四、加註解(相當於findViewByID,注意格式),先更改顯示資訊的TextView看下效果
@Bind(R.id.txtShowMessage) TextView txtShowMessage; 五、使用註解完成點選事件的設定
txtShowMessage.setText("哈哈哈哈");此時執行一下看看效果:
從效果圖可以看出,通過使用註解,TextView顯示的文字已經變了,但卻要注意一個問題,
ButterKnife的初始化必須在setContentView()之後,否則執行會報錯。這也是ButterKnife在
初始化時,不再Application中,而是在哪使用,就在哪初始化。
接下來加入TextView點選事件的相關程式碼,實現了點選後,產生動畫效果:
1.添加註解
@Bind(R.id.imgShow) ImageView imgShow;2.使用註解完成點選事件的設定
@OnClick(R.id.txtShowText) public void change(TextView textView){ imgShow.animate().scaleXBy(0.5f).alpha(0.3f).setDuration(2000).start(); textView.setText("變形成功"); }執行看一下效果:
看一下詳細的程式碼,註釋寫的很詳細,有了點選事件的註解,就不需要在前面在添加了,
同時注意點選事件裡方法的引數,是什麼控制元件,就傳該控制元件的物件,同時,我們也可以合併點選事件。
public class MainActivity extends AppCompatActivity { @Bind(R.id.txtShowMessage) TextView txtShowMessage; @Bind(R.id.imgShow) ImageView imgShow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //在佈局檔案後,進行ButterKnife的繫結,引數類物件 ButterKnife.bind(this); //使用TextView設定資料 txtShowMessage.setText("哈哈哈哈"); } //讓TextView具備了點選事件,同時引數裡就可以找到這個TextVIew(只能夠在這個方法裡使用其物件) //相當於即做了onClick點選事件,又做了findVIewByID //設定點選事件,許可權必須是預設許可權以上 @OnClick(R.id.txtShowText) public void change(TextView textView){ //讓ImageViews做動畫 imgShow.animate().scaleXBy(0.5f).alpha(0.3f).setDuration(2000).start(); //具備點選事件的TextView,改變其文字 textView.setText("變形成功"); } /*給多個控制元件一起設定點選事件格式: @OnClick( { , , .....} ) public void onClick(View view)引數是View view{ switch (view.getId()) { case R.id..... ..... break;} } */ @OnClick({R.id.btnOK,R.id.chbShow}) public void onClick(View view){ switch (view.getId()){ //為跳轉到第二個頁面的button設定了點選事件 case R.id.btnOK: Intent intent = new Intent(MainActivity.this, Main2Activity.class); startActivity(intent); break; case R.id.chbShow: //為CheckBox設定了點選事件 Toast.makeText(MainActivity.this, "試試就試試", Toast.LENGTH_SHORT).show(); break; } } }看一下效果圖:
六、ButterKnife在Fragment裡的使用
這個例子的目的是體現出,ButterKnife在Adapter和Fragment中的實現與在Activity中做對比。
由於Activity不能直接跳轉到Fragment,這裡我們採取跳轉到Main2Activity後,在裡面建立新的Fragment,將他的佈局ID(container)替換為
新建Fragment的ID。
1.Main2Activity佈局
<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/container" xmlns:android="http://schemas.android.com/apk/res/android"></FrameLayout>2.fragment佈局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imgShow2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:src="@mipmap/ic_arrow_back_black_48dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="第二個頁面" android:textSize="24sp" /> <ListView android:id="@+id/lstShow" android:layout_width="match_parent" android:layout_marginTop="8dp" android:layout_below="@+id/imgShow" android:layout_height="match_parent"></ListView> </RelativeLayout>3.ListView介面卡
public class MyAdapter extends BaseAdapter{ //上下文 Context mContext; //構造方法,從外界得到上下文物件 public MyAdapter(Context context) { mContext = context; } //listVIew載入的字串,圖片 int[] carsId={R.mipmap.car_black,R.mipmap.car_green,R.mipmap.car_red,R.mipmap.car_yellow}; String [] comentStr={"哈哈哈哈哈", "啦啦啦啦啦", "嘎嘎嘎嘎嘎", "嘿嘿嘿嘿嘿", "卡卡卡卡卡"}; @Override public int getCount() { return carsId.length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if(convertView == null ){ convertView= LayoutInflater.from(mContext).inflate(R.layout.item_list, null); viewHolder=new ViewHolder( convertView) ; convertView.setTag(viewHolder); }else{ viewHolder= (ViewHolder) convertView.getTag(); } //使用Random隨機設定圖片和評論文字,new Random().nextInt:隨機產生0到指定int數的整數 viewHolder.car_IV.setImageResource(carsId[new Random().nextInt(4)]); viewHolder.comment1_TV.setText(comentStr[new Random().nextInt(3)]); viewHolder.comment2_TV.setText(comentStr[new Random().nextInt(3)]); return convertView; } //建立listView裡面用到的ViewHolder,首先要建立其構造方法,引數是VIew view public static class ViewHolder{ @Bind(R.id.imgShowPic) ImageView car_IV; @Bind(R.id.txtShowComment1) TextView comment1_TV; @Bind(R.id.txtShowComment2) TextView comment2_TV; public ViewHolder(View view) { //進行ButterKnife的初始化,引數1 類物件,引數2VIew物件 ButterKnife.bind(this,view); } } }4.item_list佈局檔案
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/imgShowPic"
android:layout_width="wrap_content"
android:layout_height="360dp" />
<TextView
android:id="@+id/txtShowComment1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:textColor="@android:color/black"
android:textSize="16sp" />
<TextView
android:id="@+id/txtShowComment2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:textColor="@android:color/black"
android:textSize="16sp" />
</LinearLayout>
5.Main2Activity public class Main2Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); //把Activity裡的ID替換成一個Fragment getSupportFragmentManager().beginTransaction() .replace(R.id.container, new PlaceHolderFragment()) .commit(); } //一個靜態的內部類,繼承Fragment public static class PlaceHolderFragment extends Fragment { //建立listview物件 @Bind(R.id.lstShow) ListView lstShow; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment, container, false); //進行ButterKnife的繫結,在Fragment使用即使兩個引數 1.類物件 2.容器View物件, ButterKnife.bind(this, rootView); //建立一個adapter傳遞上下文,getActivity就是獲取Fragment依賴Activity的上下文 MyAdapter adapter = new MyAdapter(getActivity()); lstShow.setAdapter(adapter); return rootView; } //給Image設定點選事件,關閉當前Activity,上下文呼叫finish @OnClick(R.id.imgShow2) public void finishActivity() { getActivity().finish(); } } }效果圖:
這樣就大功告成了!
相關推薦
依賴注入ButterKnife
在Android開發中,需要大量的編寫初始化佈局、點選事件、監聽事件等一些簡單重複的程式碼,會無形中浪費時間和精力。而使用ButterKnife這個開源庫可以讓我們從大量的findViewById()和setOnclicktListener()中解放出來。
依賴注入ButterKnife,Android Annotations,Dagger2
為什麼使用開源框架 1.提高開發速度 2.提高開發質量 選擇開源框架的原則 1.聚合性框架一定要放棄,例如Afinal,xUtils *大而全的框架容易導致牽一髮而動全身,可讀性差,偶合性高,難擴充套件. 2.last commit超過一年以上或者
Android開源框架——依賴注入ButterKnife
若對依賴注入不熟悉,請閱讀部落格中的另外一篇IOC控制反轉淺析 介紹:ButterKnife是Square公司員工JakeWharton開發的一款針對View檢視物件的依賴注入庫。目的是通過依賴注入方式,將View物件的初始化簡化,並極大地改進了程式碼之間的耦
依賴注入框架-ButterKnife使用方法總結
ButterKnife 2018-9-6 10:45 - QG2017移動組 - 張藝雋 ButterKnife是JakeWharton大神出品的用於View的注入框架。提供註解來簡單快捷地完成View的繫結、點選事件的分離等。 來自官方的說明
android依賴注入框架Dagger和Butterknife實戰
依賴注入(DependencyInjection):在類A中要用到一個B的物件(依賴),需要通過新建B的例項或其他一些主動的方式來獲取物件,然後才能呼叫。而通過外部的方式自動將B的物件分配給A(注入),實現相對被動的獲取物件,這個過程稱為依賴注入。 依賴注入的一些需要理解
Android ButterKnife依賴注入框架簡單使用
Butter Knife 通過註解的方式,將Android View與成員變數和方法繫結起來,為你形成一種模板樣式的程式碼。 在成員變數上使用@BindView替換掉 findView
Android依賴注入框架二、ButterKnife
簡述: ButterKnife 是出自Android大神JakeWharton之手的一個開源庫,它的作用就是通過註解繫結檢視的方法,從而簡化程式碼量。 題外話: Java中Spring提供ioc的功能,而且Spring的HttpInvoker可以實現直接呼叫後端的物件。
SpringFramework的核心:IOC容器的實現------IoC容器的依賴注入
如果IoC容器已經載入了使用者定義的Bean資訊,並開始分析依賴注入的原理。依賴注入是使用者第一次向IoC容器索要Bean時觸發的,當然也有例外。如果我們設定了lazy-init的屬性。是可以在剛開始初始化容器的時候就為我們生成新的bean。 首先我們從DefaultListableBean
Asp.net MVC中如何實現依賴注入(DI)(二)
昨天說了一下Castle與Autofac如何在MVC中的使用,今天再來簡單說一下Spring.Net框架在MVC中如何依賴注入的。 官網:http://www.springframework.net/ 專案結構圖: 首先,我們要在專案中新增Spring.Net的類庫引用,我們可以在N
淺談依賴注入
轉載自部落格園一位前輩寫的很不錯的文章 作者: yangecnu(yangecnu’s Blog on 部落格園) 出處:http://www.cnblogs.com/yangecnu/ 淺談依賴注入 最近幾天在看一本名為Dependency Injection in .NET
Spring 學習筆記 - IOC/依賴注入
簡述: Spring 學習 - IOC/依賴注入 1. Bean 的例項化 1) 直接使用原始類建立bean <bean id="exampleBean" class="com.anialy.test.ExampleBean" /> 2) 使用工廠方法建立
PHP 控制反轉與依賴注入詳細分析與程式碼實現
PHP有很多的設計模式,比如單例模式,訂閱模式,策略模式,工廠模式,觀察者模式,這些設計模式其實無非都是為了讓程式簡化,容易維護,模組間解耦。現在我們來講講PHP的另外一種設計模式,控制反轉/依賴注入,這兩者其實是同一個概念,只是凶不同的角度去解釋的而已。 依賴注入:是從需要實現的業務邏輯上面去
深入研究Spring-IoC:原始碼分析依賴注入
1.前言 對於容器建立的過程已經闡述過一遍了,下面是依賴注入的問題。Spring提供的依賴注入的方法主要由兩種:一種是通過getBean的方法;另一種是通過註解@Autowaire。 需要指出的是依賴注入的過程是使用者第一次向ioc容器索要Bean的時候開始生產的,也可以通過設定
PHP規範PSR11(依賴注入容器介面)介紹
本文件描述了依賴注入容器的通用介面。 ContainerInterface設定的目標是標準化框架和庫如何使用容器來獲取物件和引數(在本文件的其餘部分中稱為條目)。 本文件中的關鍵詞“必須”,“必須”,“必需”,“應該”,“不應該”,“應該”,“不應該”,“推薦”,“可以”和“可選”按照RFC
1.Spring、IOC與依賴注入
Spring概述 Spring是分層的Java SE/EE應用 full-stack輕量級開源框架,以IoC(Inverse Of Control:反轉控制)和 AOP(Aspect Oriented Programming:面向切面程式設計)為核心,提供了展現層Spr
3.1依賴注入「深入淺出ASP.NET Core系列」
希望給你3-5分鐘的碎片化學習,可能是坐地鐵、等公交,積少成多,水滴石穿,謝謝關注。 從UML來理解依賴 1.1什麼是依賴 我們先看下圖 可以簡單理解,一個HomeController類使用到了DBContext類,而這種關係是有偶然性,臨時性,弱關係的,但是D
淺談Angular6的服務和依賴注入
在開發中,元件一般用來寫檢視有關的功能,服務則寫一些其他的邏輯,諸如從伺服器獲取資料、驗證使用者輸入或直接往控制檯中寫日誌等工作. 先解釋兩個概念: Providers(提供商):是個比較抽象的名詞,我們把它想象為'圖紙'更好理解一些,就比如我們想要生產汽車,就需要先有汽車的圖紙,圖紙
Angular依賴注入:類“AnotherProductService”錯誤實現類“ProductService”。你是想擴充套件“ProductService”並將其成員作為子類繼承嗎?
在做Angular依賴注入例項時候出現一個問題“類“AnotherProductService”錯誤實現類“ProductService”。你是想擴充套件“ProductService”並將其成員作為子類繼承嗎?”於是找到解決本問題的方法,由於小編剛入門所以不能給大家提供更多的解釋,只提出解決方
依賴注入的兩種常用方式(構造器和Setter)與注入內容(裝配資料)——Spring IOC/DI(三)
本章主要講解一下Spring中依賴注入方式,接上一章依賴注入原理和方式: https://blog.csdn.net/qq_34598667/article/details/83315669 依賴注入常用的兩種方式以及注入的內容(裝配資料) Spring通過DI(依賴注入)實現I
依賴注入原理,作用,注入方式——Spring IOC/DI(二)
依賴注入原理,作用,注入方式 前言 上一章我們講到了IOC和DI概述: https://blog.csdn.net/qq_34598667/article/details/83275560 這一章接上一章繼續講 依賴注入(Dependency Injection)是用於實現控制反