由于在项目中使用到了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);
现在@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();
}
});
现在 @OnClick(R.id.button)
public void finishClick(View view) {
finish();
}
注意1.这里的变量不能是private 和static, listener的参数可以写也可以不写,
并且写的时候可以直接写一个具体的子类,比如参数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没有被发现,则会报错.
为了抑制这种行为,可以用@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参数指定为一个特定的方法.
比如:
没有指定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中只要有数据,默认都会选中第0个数据,所以想进入到onNothingSelected()方法,就需要把Adapter中的数据都清空.
具体见https://github.com/mengdd/AndroidButterKnifeSample/blob/master/app/src/main/java/com/example/mengdd/butterknifesample/SpinnerActivity.java