由于在項目中使用到了Bufferknife注解无拗,最新的butterknife為8.1.0版本吨枉,這個版本與以前的版本有點差異压固,使用過程中遇到的一些問題以及使用方法記錄一下:
1.導入依賴庫:File-->Project Structure-->Dependencies--> + -->Library Dependency-->搜索ButterKnife -->OK
2.添加一些插件到build.gradle
首頁是工程Project結構下的build.gradle
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'? //<-------增加這個
}
}
allprojects {
repositories {
jcenter()
}
}
然后是你的app module的build.gradle
apply plugin: 'com.neenbedankt.android-apt'//<-------增加這個
dependencies {
compile files('libs/sjt_sdk_v1.0.1.jar')
compile files('libs/ws-commons-util-1.0.2.jar')
compile files('libs/xmlrpc-client-3.1.jar')
compile files('libs/xmlrpc-common-3.1.jar')
compile files('libs/xmlrpc-server-3.1.jar')
compile files('libs/android-support-v4.jar')
compile 'com.jakewharton:butterknife:8.1.0'
apt 'com.jakewharton:butterknife-compiler:8.1.0'//<-------增加這個
}
3.使用介紹
與以前的一些不同
@InjectView -->@BindView
@InjectViews -->@BindViews
ButterKnife.inject(this) -->ButterKnife.bind(this);
ButterKnife.reset(this) ->
private Unbinder unbinder;
unbinder = ButterKnife.bind(this, view);
@Override
public void onDestroyView() {
unbinder.unbind();
super.onDestroyView();
}
使用:
(1)代替findViewById()
以前mTextView = (TextView) findViewById(R.id.text);
現(xiàn)在@BindView(R.id.text) TextView mTextView
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nav_me);
ButterKnife.bind(this);
}
ButterKnife.bind(this)一定要在setContentView之后盏混,父類bind綁定后世舰,子類不需要再bind稚叹,View變量聲明的時候不能為private或者static
**ButterKnife 在Fragment中的使用
@BindView(R.id.me_about_us)
LinearLayout meAboutUs;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.nav_me,container, false);
ButterKnife.bind(this, view);
return view;
}
onDestroyView()中解綁
private Unbinder unbinder;
unbinder = ButterKnife.bind(this, view);
@Override
public void onDestroyView() {
unbinder.unbind();
super.onDestroyView();
}
**ButterKnife 在ViewHolder中的使用
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.common_laguage_child_item, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder=(ViewHolder)convertView.getTag();
}
JSONObject child =getItem(position);
viewHolder.tvChildCommon.setText(child.optString("content",""));
return convertView;
}
class ViewHolder {
@BindView(R.id.tv_child_common)
TextView tvChildCommon;
ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
2)代替setOnClickListener
以前 button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
現(xiàn)在 @OnClick(R.id.button)
public void finishClick(View view) {
finish();
}
注意1.這里的變量不能是private 和static, listener的參數(shù)可以寫也可以不寫焰薄,
并且寫的時候可以直接寫一個具體的子類,比如參數(shù)View可以寫成Button
2.如果只有點擊事件的話 也需要調用ButterKnife.bind(this),如果這個類中已經調用的話就不用調用了
除了點擊事件@OnClick,還有ListView的點擊@OnItemClick, CheckBox的@OnCheckedChanged等等.
可以一次指定多個id,為多個View綁定一個事件處理方法,比如:
@OnClick({R.id.rl_user_info, R.id.iv_user_avater, R.id.iv_state, R.id.me_common_language, R.id.me_setting,
R.id.me_system_notice, R.id.me_feedback, R.id.me_about_us})
public void clickItem(View v) {
}
下面這些是上網查看的其他人的日志,覺得有用就記下來了
(3)把多個view放在一起@InjectViews({R.id.first, R.id.middle, R.id.last})ListViews;
(4)選擇性注入(Optional Injection):
默認情況下,@InjectView和listener的注入都是必須的,如果target view沒有被發(fā)現(xiàn),則會報錯.
為了抑制這種行為,可以用@Optional注解來標記field和方法,讓注入變成選擇性的,如果targetView存在,則注入, 不存在,則什么事情都不做.
當布局被復用時,這個@Optional注解很有用.
(5)findById()方法
ButterKnife.findById()可以用來獲取Activity,Dialog或View中的任何View.
ButterKnife自動完成了類型轉換,所以獲取出來以后不用進行顯式強轉,直接賦值給具體的View類型引用即可.
(6)多方法的listener:
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView parent, View view, int position, long id) {
}
@Override
public void onNothingSelected(AdapterView parent) {
}
});
方法注解可以用來綁定到這些方法中的任何一個.
每一個注解有一個默認的callback,指定它綁定到什么方法上;可以通過callback參數(shù)指定為一個特定的方法.
比如:
沒有指定callback,默認對應onItemSelected()方法:
@OnItemSelected(R.id.my_spinner)
//default callback : ITEM_SELECTED
void onItemSelected(int position) {
Toast.makeText(this, "position: " + position, Toast.LENGTH_SHORT).show();
}
指定了callback,對應onNothingSelected()方法:
@OnItemSelected(value = R.id.my_spinner, callback = OnItemSelected.Callback.NOTHING_SELECTED)
void onNothingSelected() {
Toast.makeText(this, "Nothing", Toast.LENGTH_SHORT).show();
}
注意的是Spinner中只要有數(shù)據(jù),默認都會選中第0個數(shù)據(jù),所以想進入到onNothingSelected()方法,就需要把Adapter中的數(shù)據(jù)都清空.
具體見https://github.com/mengdd/AndroidButterKnifeSample/blob/master/app/src/main/java/com/example/mengdd/butterknifesample/SpinnerActivity.java