Android學習筆記- ButterKnife 8.0註解使用介紹

来源:http://www.cnblogs.com/zc2014blog/archive/2017/06/25/7076681.html
-Advertisement-
Play Games

前言: App項目開發大部分時候還是以UI頁面為主,這時我們需要調用大量的findViewById以及setOnClickListener等代碼,控制項的少的時候我們還能接受,控制項多起來有時候就會有一種想砸鍵盤的衝動。所以這個時候我們想著可以藉助註解的方式讓我們從這種繁重的工作中脫離出來,也讓代碼變得 ...


前言:

     App項目開發大部分時候還是以UI頁面為主,這時我們需要調用大量的findViewById以及setOnClickListener等代碼,控制項的少的時候我們還能接受,控制項多起來有時候就會有一種想砸鍵盤的衝動。所以這個時候我們想著可以藉助註解的方式讓我們從這種繁重的工作中脫離出來,也讓代碼變得更加簡潔,便於維護,今天主要學習一下只專註View、Resource、Action註解框架ButterKnife。

ButterKnife介紹

    ButterKnife是一個專註於Android系統的View、Resource、Action註入框架。

    官網:http://jakewharton.github.io/butterknife/

    gitHub:https://github.com/JakeWharton/butterknife/

ButterKnife使用前後對比:

    看看沒有使用View註解之前我們是如何做的

1.)使用之前
public class ExampleActivity extends AppCompatActivity {
    private final static String TAG = ExampleActivity.class.getSimpleName();
    String butterKnifeStr;
    Drawable butterKnifeDrawable;
    Button butterKnifeBtn;
    ImageView butterKnifeIv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_butter_knife);
        initResource();
        initViews();
    }

    private void initViews() {
        butterKnifeBtn = (Button) findViewById(R.id.btn_butter_knife);
        butterKnifeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e(TAG, "onButterKnifeBtnClick");
            }
        });
        butterKnifeIv = (ImageView) findViewById(R.id.iv_butter_knife);
        butterKnifeBtn.setText(butterKnifeStr);
        butterKnifeIv.setImageDrawable(butterKnifeDrawable);
    }

    private void initResource() {
        butterKnifeStr = getString(R.string.title_btn_butter_knife);
        butterKnifeDrawable = getDrawable(R.mipmap.ic_launcher);
    }
}

 

2.)使用之後
public class ButterKnifeActivity extends AppCompatActivity {
    private final static String TAG = ButterKnifeActivity.class.getSimpleName();
    private Unbinder unbinder;
    @BindString(R.string.title_btn_butter_knife)
    String butterKnifeStr;
    @BindDrawable(R.mipmap.ic_launcher)
    Drawable butterKnifeDrawable;
    @BindView(R.id.btn_butter_knife)
    Button butterKnifeBtn;
    @BindView(R.id.iv_butter_knife)
    ImageView butterKnifeIv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_butter_knife);
        unbinder = ButterKnife.bind(this);
        initViews();
    }

    private void initViews() {
        butterKnifeBtn.setText(butterKnifeStr);
        butterKnifeIv.setImageDrawable(butterKnifeDrawable);
    }

    @OnClick(R.id.btn_butter_knife)
    public void onButterKnifeBtnClick(View view) {
        Log.e(TAG, "onButterKnifeBtnClick");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbinder.unbind();
    }
}

 

3.)ButterKnife 優勢

   通過上面使用前後對比來分析下ButterKnife優勢 

  • 強大的View綁定和Click事件處理功能,簡化代碼,提升開發效率
  • 方便的處理Adapter里的ViewHolder綁定問題
  • 運行時不會影響APP效率,使用配置方便
  • 代碼清晰,可讀性強

使用前後對比之後有沒有覺得非常的簡單易用。接下來來看下具體怎麼使用的?

ButterKnife如何使用:

   1.)在Project的build.gradle中添加如下配置
buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  }
}

 

2.)在Module的build.gradle添加如下配置
apply plugin: 'com.neenbedankt.android-apt'

android {
  ...
}

dependencies {
  compile 'com.jakewharton:butterknife:8.1.0'
  apt 'com.jakewharton:butterknife-compiler:8.1.0'
}

 

3.)註入和重置註入

Activity

class ExampleActivity extends Activity {
  @BindView(R.id.title) TextView title;
  @BindView(R.id.subtitle) TextView subtitle;
  @BindView(R.id.footer) TextView footer;

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);
    // TODO Use fields...
  }
}

 

Fragment:由於不同的視圖生命周期,所以需要在onCreateView bind,在onDestroyView unbind

public class FancyFragment extends Fragment {
  @BindView(R.id.button1) Button button1;
  @BindView(R.id.button2) Button button2;
  private Unbinder unbinder;

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    unbinder = ButterKnife.bind(this, view);
    // TODO Use fields...
    return view;
  }

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

 

ViewHolder

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);
    }
  }
}

 

4.)view註入 @BindView,@BindViews
 @BindView(R.id.btn_butter_knife)
    Button butterKnifeBtn;
    @BindViews({R.id.tv_butter_knife1,R.id.tv_butter_knife2,R.id.tv_butter_knife3})
    List<TextView> textViews;

 

5.)Resource註入
 @BindString(R.string.title_btn_butter_knife)
    String butterKnifeStr;//string註解使用
    @BindDrawable(R.mipmap.ic_launcher)
    Drawable butterKnifeDrawable;//Drawable註解使用
    @BindBitmap(R.mipmap.ic_launcher)
    Bitmap  butterKnifeBitmap;;//Bitmap註解使用
    @BindArray(R.array.day_of_week)
    String weeks[];//數組
    @BindColor(R.color.colorPrimary)
    int colorPrimary;//color註解使用
    @BindDimen(R.dimen.activity_horizontal_margin)
    Float spacer;

 

6.)單事件註入

一個控制項指定一個事件回調

    /**
     * 帶參數
     */
    @OnClick(R.id.btn_butter_knife)
    public void onButterKnifeBtnClick() {
    }

    /**
     * 帶參數
     */
    @OnClick(R.id.btn_butter_knife)
    public void onButterKnifeBtnClick(View view) {
        Log.e(TAG, "onButterKnifeBtnClick");
    }

    /**
     * 帶參數
     * @param button
     */
    @OnClick(R.id.btn_butter_knife)
    public void onButterKnifeBtnClick(Button button) {
        Log.e(TAG, "onButterKnifeBtnClick");
    }

 

也可以多個控制項指定一個事件回調

   /**
     * 兩個不同的button都相應onButterKnifeBtnClick事件回調
     *
     * @param button
     */
    @OnClick({R.id.btn_butter_knife, R.id.btn_butter_knife1})
    public void onButterKnifeBtnClick(Button button) {
        Log.e(TAG, "onButterKnifeBtnClick");
    }

 

自定義的控制項不通過ID也可以綁定到自己的事件

public class FancyButton extends Button {
  @OnClick
  public void onClick() {
    // TODO do something!
  }
}

 

7.)多事件回調

有一些View的listener是有多個回調方法的,比如EditText添加addTextChangedListener

editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

 

可以使用註解方式改成如下

 @OnTextChanged(value = R.id.nameEditText, callback = OnTextChanged.Callback.BEFORE_TEXT_CHANGED)
    void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }
    @OnTextChanged(value = R.id.nameEditText, callback = OnTextChanged.Callback.TEXT_CHANGED)
    void onTextChanged(CharSequence s, int start, int before, int count) {

    }
    @OnTextChanged(value = R.id.nameEditText, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
    void afterTextChanged(Editable s) {

    }

 

8.)選擇性註入

預設情況下,@Bind 和listener的註入都是必須的,如果target view沒有被髮現,則會報錯. 為了抑制這種行為,可以用@Optional註解來標記field和方法,讓註入變成選擇性的,如果targetView存在,則註入, 不存在,則什麼事情都不做.或者使用 Android's "support-annotations" library.中的@Nullable來修飾

@Nullable @BindView(R.id.might_not_be_there)
TextView mightNotBeThere;

@Optional @OnClick(R.id.maybe_missing) 
void onMaybeMissingClicked() {
  // TODO ...
}

 

9.)ButterKnife.apply()函數

  可以通過ButterKnifeapply()函數對view集合元素或者單個view的Action, Setter和Property進行修改

ButterKnife.apply(nameViews, DISABLE);
ButterKnife.apply(nameViews, ENABLED, false);

static final ButterKnife.Action<View> DISABLE = new ButterKnife.Action<View>() {
  @Override public void apply(View view, int index) {
    view.setEnabled(false);
  }
};
static final ButterKnife.Setter<View, Boolean> ENABLED = new ButterKnife.Setter<View, Boolean>() {
  @Override public void set(View view, Boolean value, int index) {
    view.setEnabled(value);
  }
};

ButterKnife.apply(nameViews, View.ALPHA, 0.0f);

 

10.)ButterKnife.findById()

     ButterKnife 也提供了findById函數,通過findById()可以獲取Activity、Dialog、View中的view,並且是泛型類型不需要強轉

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);

 

ButterKnife自動生成插件安裝:

   在AndroidStudio->File->Settings->Plugins->搜索Zelezny下載添加就行 ,可以快速生成對應組件的實例對象,不用手動寫。使用時,在要導入註解的Activity 或 Fragment 或 ViewHolder的layout資源代碼上,右鍵——>Generate——Generate ButterKnife Injections,然後就出現如圖的選擇框。

 插件gitHub地址:https://github.com/avast/android-butterknife-zelezny

 下麵給了一個使用流程圖

 

參考鏈接:http://www.cnblogs.com/whoislcj/p/5620128.html

     http://jakewharton.github.io/butterknife/javadoc/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • javascript的數據類型 (symbol)一、原始數據類型 或 基本數據類型 6種 1,undefined (1,申明未賦值,2,函數沒有返回值)2,null (空,不存在)3,number (數字,小數和整數)4,boolean (布爾值,true,false) 5,string (字元串, ...
  • 一、position語法與結構 position語法: position : static absolute relative position參數:static : 無特殊定位,對象遵循HTML定位規則absolute : 將對象從文檔流中拖出,使用left,right,top,bottom等屬性 ...
  • 前言 眾所周知ES6新增的const關鍵字可以用來聲明常量,但是它只對基本數據類型生效(Number、String、Boolean等),那如果我們想聲明一個常量對象呢?該如何實現,Object內置對象早就替我們想到了,下麵來具體看一下 正題 一、先來看一下const方式來聲明基本類型常量 代碼: 運 ...
  • 今天的知識點主要是數組的迭代方法中的一種filter()方法、數組操作方法中的concat()方法以及字元串的replace()方法。filter()方法可用於使用函數判斷數組中各項的值中返回true值的結果所組成的數組。concat()可以複製和創建新數組。而replace()方法可以替換字元串中... ...
  • 聲明:該書的筆者為徐嬴老師,一名具有5年IOS開發經驗,和兩年RN開發經驗的老司機。 原文可以在gitbook上找到 筆者只是為他的書中提的的一些列問題,進行有償答疑。 有償答疑。本書將持續保持更新,有關問題可以加群討論。 正在上傳...取消 正在上傳...取消 正在上傳...取消 正在上傳...取 ...
  • 這篇依然是跟 相關的方法,側重點是操作屬性的方法。 讀Zepto源碼系列文章已經放到了github上,歡迎star: "reading zepto" 源碼版本 本文閱讀的源碼為 "zepto1.2.0" 內部方法 setAttribute 如果屬性值 存在,則調用元素的原生方法 設置對應元素的指定屬 ...
  • 在Android的設計中,資源的訪問或者網路連接,要得到這些服務都需要聲明其訪問許可權,否則將無法正常工作。在Android中這樣的許可權有很多種,這裡將各類訪問許可權一一羅列出來,供大家使用時參考之用。 android.permission.EXPAND_STATUS_BAR 允許一個程式擴展收縮在狀態 ...
  • 網路狀態監測,分為兩種:動態註冊和靜態註冊。無論哪種方式,都會遇到許可權的問題,其實只要在AndroidManifest.xml中加入如下一句代碼: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 用模 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...