1. 程式人生 > >依賴注入ButterKnife

依賴注入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)是用於實現控制反