Android
バターナイフ
サーチ…
前書き
Butterknifeは、注釈を使用してボイラープレートコードを生成するビューバインディングツールです。このツールは、SquareのJake Whartonによって開発されたもので、ビューを扱う際にfindViewById(R.id.view)
ようなコードの繰り返し入力をfindViewById(R.id.view)
するために使用されています。
明確にするために、Butterknifeは依存性注入ライブラリではありません 。 Butterknifeはコンパイル時にコードを挿入します。 Androidアノテーションで行われた作業と非常によく似ています。
備考
バターナイフ
注釈処理を使用して定型コードを生成するAndroidビューのフィールドとメソッドバインディング
- フィールドの@BindViewを使用してfindViewById呼び出しを削除します。
- リストまたは配列内の複数のビューをグループ化する。アクション、セッター、またはプロパティを使用して、それらを一度にすべて操作します。
- @OnClickなどのメソッドに注釈を付けることによって、リスナーの匿名の内部クラスを排除します。
- フィールドのリソース注釈を使用してリソースの参照を排除します。
詳細: http : //jakewharton.github.io/butterknife/
ライセンス
著作権2013 Jake Wharton
Apache License、Version 2.0(以下「ライセンス」)の下でライセンスされています。ライセンスに従わない限り、このファイルを使用することはできません。あなたはライセンスのコピーを
http://www.apache.org/licenses/LICENSE-2.0
適用法または書面による合意が必要な場合を除き、本ライセンスに基づいて配布されるソフトウェアは、明示的または黙示的にいかなる種類の保証または条件もなく「現状有姿」で配布されます。ライセンスに基づいて許可および制限を規定する特定の言語については、ライセンスを参照してください。
あなたのプロジェクトでButterKnifeを設定する
android-apt
プラグインを含めるようにプロジェクトレベルのbuild.gradle
を設定します。
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
次に、モジュールレベルのbuild.gradle
android-apt
プラグインを適用し、ButterKnifeの依存関係を追加します。
apply plugin: 'android-apt'
android {
...
}
dependencies {
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
注意:バージョン2.2.0以降の新しいJackコンパイラを使用している場合は、 android-apt
プラグインは必要ありません。コンパイラの依存関係を宣言するときは、aptをannotationProcessor
に置き換えることができます。
あなたがそれらを結合を忘れるべきではありませんButterKnife注釈を使用するためには、 onCreate()
あなたの活動やのonCreateView()
あなたのフラグメントのを:
class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Binding annotations
ButterKnife.bind(this);
// ...
}
}
// Or
class ExampleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(getContentView(), container, false);
// Binding annotations
ButterKnife.bind(this, view);
// ...
return view;
}
}
開発バージョンのスナップショットは、 Sonatypeのスナップショットリポジトリにあります 。
以下は、ライブラリプロジェクトでButterKnifeを使用するために必要な追加ステップです
ライブラリプロジェクトでButterKnifeを使用するには、プラグインをプロジェクトレベルのbuild.gradle
に追加します。
buildscript {
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
...あなたのライブラリレベルbuild.gradle
上に次の行を追加してモジュールに適用します:
apply plugin: 'com.android.library'
// ...
apply plugin: 'com.jakewharton.butterknife'
今、あなたが使用していることを確認しR2
の代わりに、 R
すべてButterKnife注釈内。
class ExampleActivity extends Activity {
// Bind xml resource to their View
@BindView(R2.id.user) EditText username;
@BindView(R2.id.pass) EditText password;
// Binding resources from drawable,strings,dimens,colors
@BindString(R.string.choose) String choose;
@BindDrawable(R.drawable.send) Drawable send;
@BindColor(R.color.cyan) int cyan;
@BindDimen(R.dimen.margin) Float generalMargin;
// Listeners
@OnClick(R.id.submit)
public void submit(View view) {
// TODO submit data to server...
}
// bind with butterknife in onCreate
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
// TODO continue
}
}
ButterKnifeを使用したビューのバインド
@BindView
とバターナイフのビューIDでフィールドに注釈を付けると、レイアウト内の対応するビューを見つけて自動的にキャストできます。
バインディングビュー
アクティビティのビューのバインド
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...
}
}
フラグメント内のビューのバインド
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;
}
// in fragments or non activity bindings we need to unbind the binding when view is about to be destroyed
@Override
public void onDestroy() {
super.onDestroy();
unbinder.unbind();
}
}
ダイアログのビューのバインド
ButterKnife.findById
を使用して、ビュー、アクティビティ、またはダイアログに関するビューを見つけることができます。ジェネリックを使用して戻り値の型を推測し、自動的にキャストを実行します。
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);
ViewHolderでのビューのバインド
static class ViewHolder {
@BindView(R.id.title) TextView name;
@BindView(R.id.job_title) TextView jobTitle;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
バインディングリソース
別にビューを結合するのに有用であるから、人はまた、このような内で定義されたものなどのリソースバインドするButterKnifeを使用することができますstrings.xml
、 drawables.xml
、 colors.xml
、 dimens.xml
など
public class ExampleActivity extends Activity {
@BindString(R.string.title) String title;
@BindDrawable(R.drawable.graphic) Drawable graphic;
@BindColor(R.color.red) int red; // int or ColorStateList field
@BindDimen(R.dimen.spacer) Float spacer; // int (for pixel size) or float (for exact value) field
@Override
public void onCreate(Bundle savedInstanceState) {
// ...
ButterKnife.bind(this);
}
}
ビューリストのバインド
複数のビューをリストまたは配列にグループ化できます。これは、一度に複数のビューに対して1つのアクションを実行する必要がある場合に非常に役立ちます。
@BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name })
List<EditText> nameViews;
//The apply method allows you to act on all the views in a list at once.
ButterKnife.apply(nameViews, DISABLE);
ButterKnife.apply(nameViews, ENABLED, false);
//We can use Action and Setter interfaces allow specifying simple behavior.
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);
}
};
オプションのバインディング
デフォルトでは、 @Bind
バインディングとリスナーバインディングの両方が必要です。ターゲットビューが見つからない場合は、例外がスローされます。しかし、ビューが存在するかどうかわからない場合は、 @Nullable
アノテーションをフィールドに追加するか、 @Optional
アノテーションをメソッドに追加して、この動作を抑制し、オプションのバインディングを作成することができます。
@Nullable
@BindView(R.id.might_not_be_there) TextView mightNotBeThere;
@Optional
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
// TODO ...
}
ButterKnifeを使用したバインディングリスナー
OnClickリスナー:
@OnClick(R.id.login)
public void login(View view) {
// Additional logic
}
リスナメソッドへの引数はすべてオプションです。
@OnClick(R.id.login)
public void login() {
// Additional logic
}
特定のタイプは自動的にキャストされます:
@OnClick(R.id.submit)
public void sayHi(Button button) {
button.setText("Hello!");
}
共通のイベント処理のための単一のバインディング内の複数のID:
@OnClick({ R.id.door1, R.id.door2, R.id.door3 })
public void pickDoor(DoorView door) {
if (door.hasPrizeBehind()) {
Toast.makeText(this, "You win!", LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Try again", LENGTH_SHORT).show();
}
}
カスタムビューは、IDを指定しないことによって、独自のリスナーにバインドできます。
public class CustomButton extends Button {
@OnClick
public void onClick() {
// TODO
}
}
ButterKnifeでのビューのバインド解除
フラグメントは、アクティビティよりもビューのライフサイクルが異なります。 onCreateViewでフラグメントをバインドするときは、onDestroyViewでビューをnullに設定します。バターナイフはバインドを呼び出してこれを行うためUnbinderのインスタンスを返します。適切なライフサイクルコールバックでunbindメソッドを呼び出します。
例:
public class MyFragment extends Fragment {
@BindView(R.id.textView) TextView textView;
@BindView(R.id.button) Button button;
private Unbinder unbinder;
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
unbinder = ButterKnife.bind(this, view);
// TODO Use fields...
return view;
}
@Override public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
注意:onDestroyView()でunbind()を呼び出す必要はありませんが、アプリが大きなバックスタックを持つ場合はかなりのメモリを節約できるのでお勧めします。
Android Studio ButterKnifeプラグイン
Android ButterKnife Zelezny
アクティビティ/フラグメント/アダプタ内の選択されたレイアウトXMLからButterKnifeインジェクションを生成するためのプラグイン。
注: your_xml_layou (R.layout.your_xml_layou
)を右クリックし、 GenerateメニューにButterknifeインジェクタオプションが含まれていないことを確認してください。
リンク: JetbrainsプラグインAndroid ButterKnife Zelezny