Java
Android
ButterKnife

ButterKnifeを使ってみたまとめ

はじめに

Androidアプリを構築するうえでButterKnifeを利用すると捗る!ということを知ったので、
導入方法や使い方をまとめます。

なお、開発環境は以下の通りです。

  • AndroidStudio ver2.2.2
  • ButterKnife ver8.5.1

ButterKnifeとは

様々な記事・書籍などで紹介されているため新たに導入しやすいライブラリの一つだと思います。

ButterKnifeはidとviewとをアノテーション(@~)によって関連付けることで、
findViewByIDやOnClickListenerなどviewに関連した記述を減らすことができます。

ButterKnifeの導入方法

  • build.gradle(Project)
    dependencies内に下記の記述を追加する。
dependencies{
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.7'
        classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
  • build.gradle(app)
    apply plugin: 'com.android.application'のあとに下記の記述を追加する。
apply plugin: 'com.jakewharton.butterknife'

dependencies内に下記の記述を追加する。

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

ButterKnifeの使用方法

使用方法は公式サイトを参考にしました。

おおまかな処理の流れ

  1. @BindViewを用いて関連付けるIDと変数を宣言する。
  2. @ButterKnife.bind()を記述し、IDと変数を関連付ける。

関連付けるIDとViewの宣言

コード中にある[]部分は対応したIDを入力してください。

  • 一般的な書き方
    @BindView(R.id.[ID])
    ListView listView;
  • ボタンをクリックしたときのイベント
    @OnClick(R.id.[ID])
    public void onClick(View v) {
        // クリック時の処理を記述
    }

「複数あるボタンで同一の処理をしたい」というときは下記のようにコードを書くことで実装できます

    @OnClick({R.id.[ID],R.id.[ID]})
    public void onClick(View v) {
        // クリック時の処理を記述
    }
  • ListViewのItemをクリックしたときのイベント
    @OnItemClick(R.id.[ID])
    void OnListItemClick(int position) {
        // Itemクリック時の処理
    }

※上記のコードはクリックしたアイテムの位置を取得する書き方です。

IDとviewとを関連付ける

  • Activityの場合(引数:activity)
    OnCreate(){
        ButterKnife.bind(this);
    }
  • Fragmentの場合(引数:activity , view)

Fragmentの場合はviewを渡す必要があります。

    OnCreateView(){
        ButterKnife.bind(this,view);
    }

Tips

アノテーションをつけたのに動作しない

  1. ButterKnife.bindが記述されているかを確認
  2. gradleの記述を確認
     Gradleプラグインが22未満の場合はannotationProcessorではなくaptと記述してください。
     動作しない原因となります。

ListViewのアイテムをクリックした際のイベントについて

KeithYokomaさんの記事にありましたが、listviewにヘッダなどが登録されているとクリックされたアイテムの位置と取得する位置がずれることがあるらしいのでご注意ください。

ver7未満からの変更点

verの違いによって書き方が違うようなのでご注意ください。

ver7未満 ver7以降
@InjectView @BindView
@InjectViews @BindView
ButterKnife.inject ButterKnife.bind
ButterKnife.reset ButterKnife.unbind