butterknife使用方法

jopen 8年前發布 | 34K 次閱讀 Android開發 移動開發

Butter Knife , Android 視圖中field和方法的綁定

帶有“@Bind(R.id.xxx)” Butter Knife注解的域(或者叫字段),Butter Knife 會自動在布局中查找相應的視圖。

1.Activity中的綁定

class ExampleActivity extends Activity {

  @Bind(R.id.title) TextView title;  
  @Bind(R.id.subtitle) TextView subtitle;  
  @Bind(R.id.footer) TextView footer;  
  
  @Override public void onCreate(Bundle savedInstanceState) {    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);
  }
}

代碼通過執行視圖查找,來取代速度較慢的反射。調用綁定注解生成的代碼你可以看到并且可以進行調試。

上面的例子所生成的代碼大致相當于以下:

public void bind(ExampleActivity activity) {
  activity.subtitle = (android.widget.TextView) activity.findViewById(2130968578);
  activity.footer = (android.widget.TextView) activity.findViewById(2130968579);
  activity.title = (android.widget.TextView) activity.findViewById(2130968577);
}

2.資源綁定

通過預定義的注解(@BindBool, @BindColor, @BindDimen, @BindDrawable, @BindInt, @BindString)結合一個資源 ID以和表示該資源類型的相應的字段。

class ExampleActivity extends Activity {
  @BindString(R.string.title) String title;  
  @BindDrawable(R.drawable.graphic) Drawable graphic;  
  @BindColor(R.color.red) int red; 
  @BindDimen(R.dimen.spacer) Float spacer; 
  // ...
}

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

4.List適配器中的用法

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:

  1. 使用Activity為根視圖綁定任意對象時,如果你使用類似MVC的設計模式你可以在Activity 調用ButterKnife.bind(this, activity),來綁定Controller。

    2.使用ButterKnife.bind(this)綁定一個view的子節點字段.如果你在子View的布局里或者自定義view的構造方法里使用了inflate,你可以立刻調用此方法。或者,從XML inflate來的自定義view類型可以在onFinishInflate回調方法中使用它。

5.View集合中的使用

你可以將多個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時,Butter Knife 的 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>;
}

注意在eclipse的配置:將jar放到libs里,鼠標對準需要注解的項目,單擊右鍵properties->java Compiler->Annotation Procession->勾一下Enable project specific settings其他的會自動勾上

同類文章參考:

開源中國源碼學習(六)——ButterKnife的使用


來自: http://blog.csdn.net/i374711088/article/details/49102003

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!