Butter Knife
github連接:https://github.com/JakeWharton/butterknife
本文使用的butterknife版本7.0.1
butterknife:使用依賴注入的方式為你的Android views綁定字段方法。
1控件綁定
通過使用@bind和一個資源ID,butterknife會自動綁定到layout中聲明資源。textview為例
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; import butterknife.Bind; import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity { @Bind(R.id.title) TextView title; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); title.setText("this is a test"); } }
2 res資源綁定
通過使用@BindBool
, @BindColor
, @BindDimen
, @BindDrawable
, @BindInt
, @BindString
,綁定預定義的資源;
public class MainActivity extends AppCompatActivity { @BindString(R.string.app_name) String appName; @BindDrawable(R.mipmap.ic_launcher)Drawable drawable; @BindColor(R.color.colorAccent) int color; @BindDimen(R.dimen.activity_horizontal_margin) int margin;// int (for pixel size) or float (for exact value) field @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); } }
3 Fragment中的綁定
public class FancyFragment extends Fragment { @Bind(R.id.button1) Button button1; @Bind(R.id.button2) Button button2; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fancy_fragment, container, false); ButterKnife.bind(this, view);//這里調用的是bind(context,view)方法 // TODO Use fields... return view; } }
4 Adapter中的綁定
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("測試"); return view; } static class ViewHolder { @Bind(R.id.title) TextView name; @Bind(R.id.job_title) TextView jobTitle; public ViewHolder(View view) { ButterKnife.bind(this, view); } } }
其他綁定API:
-
使用Activity為根視圖綁定任意對象時,如果你使用類似MVC的設計模式你可以在Activity 調用ButterKnife.bind(this, activity),來綁定Controller。
-
使用ButterKnife.bind(this)綁定一個view的子節點字段.如果你在子View的布局里或者自定義view的構造方法里 使用了inflate,你可以立刻調用此方法。或者,從XML inflate來的自定義view類型可以在onFinishInflate回調方法中使用它。
5View集合中的使用
可以將多個view組成一個List或數組。
@Bind({ R.id.first_name, R.id.middle_name, R.id.last_name })
List<EditText> nameViews;
apply方法可以一次作用到所有的View。
ButterKnife.apply(nameViews, DISABLE); ButterKnife.apply(nameViews, ENABLED, false);
Action 和 Setter 接口可以指定簡單的行為。
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); } };
Android的Property(配置信息)也可以被用在apply方法中
ButterKnife.apply(nameViews, View.ALPHA, 0.0f);
6.監聽器綁定
Butter knife可以自動將偵聽器配置為方法。
@OnClick(R.id.submit) public void submit(View view) { } @OnClick(R.id.submit) public void submit() { } //定義的指定類型將會被自動轉換 @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(); } }
自定義View可以綁定自己的偵聽器但是不用指定一個id。
public class MyButton extends Button { @OnClick public void onClick() { } }
7.重置綁定
Fragment的生命周期與Activity不同,當我們在onCreateView綁定Fragment,在onDestroyView將View 設置為null時,可以使用unbind()方法。
public class FancyFragment extends Fragment { @Bind(R.id.button1) Button button1; @Bind(R.id.button2) Button button2; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fancy_fragment, container, false); ButterKnife.bind(this, view); return view; } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.unbind(this); } }
8.可選綁定
默認情況下,”@Bind”和”@OnClick”(或者其他監聽)監聽綁定都是必需的。如果不能找到目標視圖,則會引發異常。
為了制止這種行為,創建一個可選的結合,添加一個‘@Nullable’注解字段或方法。
任何名字為@Nullable的注解可以被這樣使用。鼓勵你使用Android自己的注解庫”support-annotations”中的@Nullable注解,參見Android Tools Project.
@Nullable @Bind(R.id.might_not_be_there) TextView mightNotBeThere; @Nullable @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() { }
9.多元監聽
與方法注解相匹配的監聽器有多個回調可以被用來綁定在他們中間的任何一個身上。每一個注解都有默認的回調跟它綁定在一起。可以使用callback參數聲明一個可替代的回調。
@OnItemSelected(R.id.list_view) void onItemSelected(int position) { } @OnItemSelected(value = R.id.maybe_missing, callback = NOTHING_SELECTED) void onNothingSelected() { }
10.在Android Studio 中配置
compile ‘com.jakewharton:butterknife:7.0.1’
11.代碼混淆
在代碼混淆的時候可能出問題,這時候需要在當前model下的proguard-rules.pro文件做如下修改:
-keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * { @butterknife.* <fields>; } -keepclasseswithmembernames class * { @butterknife.* <methods>; }
參考:http://blog.csdn.net/i374711088/article/details/49102003