butterknife作为Android App开发中的一款利器,在Android Studio开发时,不得不使用它来简化开发任务的繁重,相比Android annotations,在性能上具有一定的优化。接下来,直奔主题,看看一款新建的app应用是如何使用butterknife的。
环境
Android Studio 3.4.1
butterknife 10.0.0
java版本为1.8
第一步,新建立一个项目,也可以使用已有的项目,在这里为了方便演示,减少关联,新建了一个empty activity项目
第二步,进行butterknife插件的安装,
安装butterknife有两种方式,一种是通过file->structure->dependencies进行在线安装,另一种通过手动配置进行安装;这里采用手动配置;不管是哪种,最终还是要检查配置文件。
1)在项目的build.gradle的dependencies增加
classpath 'com.jakewharton:butterknife-gradle-plugin:10.1.0'
2)在app的build.gradle的头部增加
apply plugin: 'com.jakewharton.butterknife'
3)在app的build.gradle的dependencies增加
implementation 'com.jakewharton:butterknife:10.1.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
4)在app的build.gradle的android属性下,增加jdk的版本,否则容易报各种莫名的错误
//指定jdk版本
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
第三步,检验butterKnife是否能正常使用,修改activity的代码如下:
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用butterKnife进行绑定,很重要,不然click等等绑定事件不起作用
ButterKnife.bind(this);
}
@OnClick(R.id.button) void click(){
Log.i("aaaaaaaaaa","BBBBBBBBBBbbb");
Toast.makeText(this, "bbbbb", Toast.LENGTH_SHORT).show();
}
}
注意事项:
绑定的事件,如果不起作用,就需要检查一下在onCreate方法里,是否使用ButterKnife进行绑定了,刚开始使用,容易遗漏。
在这次配置中,失败了好几次,也找了网上的很多资料,都没有解决配置中失败的问题,无论是手动配置,还是配置文件Sync Now。
使用9.1.0-rc1的版本时,本系统只支持9.1.0-rc2以上的版本;
使用9.1.0-rc2的版本时,需要支持AndroidX,打开配置一看,是支持的呀?
最后换了10.1.0的版本,又报错找不到等等,翻了很多资料,先把jdk的版本加一加吧,没想到,加了这个就好了,可以运行了。
使用butterknife的好处,就是可以不用在xml文件中进行事件绑定,还可以在activity中直接对有id属性的控件进行各种操作,以注解的方式来简化操作。另外butterknife不是基于反射机制的,在翻译的时候就把代码生成,所以不影响性能,这是butterknife的一个优点。
ButterKnife使用实例
一、绑定事件
@OnClick(R.id.fab)
public void show(View view){
Snackbar.make(view, "Replace with your own action",Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
@OnItemSelected(R.id.list_view)
void onItemSelected(int position) {
// TODO ...
}
@OnItemSelected(value = R.id.maybe_missing, callback = NOTHING_SELECTED)
void onNothingSelected() {
// TODO ...
}
二、绑定视图
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.fab)
FloatingActionButton fab;
三、在activity、fragment、Adapter初始化的时候进行绑定操作
activity的onCreate方法
public class MainActivity extends AppCompatActivity {
//绑定文本
@BindView(R.id.title1) TextView title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用butterKnife进行绑定,很重要,不然click等等绑定事件不起作用
ButterKnife.bind(this);
//设置标题
title.setText("标题");
}
Fragment的onCreateView方法
public class FancyFragment extends Fragment {
@BindView(R.id.button1) Button button1;
@BindView(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);
// TODO Use fields...
return view;
}
}
Adapter中的ViewHolder方法
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("John Doe");
// etc...
return view;
}
static class ViewHolder {
@BindView(R.id.title) TextView name;
@BindView(R.id.job_title) TextView jobTitle;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}
常用注解:
@BindViews
绑定多个view id 为一个view的list变量 @BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name }) List<EditText> nameViews;
@BindView
绑定一个view id为一个view变量@BindView(R.id.title) TextView title;
@BindArray
绑定String中的array数组 @BindArray(R.array.city)String[] citys;
@BindBitmap
绑定图片资源文件, @BindBitmap(R.mipmap.wifi) Bitmap bitmap;
@BindBool
绑定真假boolean @BindBool(R.bool.boor)
@BindColor
绑定颜色 @BindColor(R.color.red)
@BindDimen
绑定尺寸 @BindDimen(R.dimen.spacer) Float spacer;
@BindDrawable
绑定Drawable @BindDrawable(R.drawable.graphic) Drawable graphic
@BindFloat
绑定Float
@BindInt
绑定Int
@BindString
绑定一个String id为String变量, @BindString(R.string.app_name) String msg
@BindAnim
绑定动画
@BindFont
绑定字体文字
绑定事件,一共有12个事件监听
@OnClick
点击事件
@OnCheckedChanged
选中,选中取消
@OnEditorAction
软键盘的功能按键
@OnFocusChange
焦点改变
@OnItemClick
Item被点击事件(注意这里有坑,如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false)
@OnItemLongClick
tem长按,返回真则可以拦截onItemClick
@OnItemSelected
Item被选择事件
@OnLongClick
长按事件
@OnPageChange
页面改变事件
@OnTextChanged
EditText里面的文本变化事件
@OnTouch
触摸事件
@Optional
选择性注入,如果当前对象不存在,就会抛出一个异常,为了压制这个异常,可以在变量或者方法上加入一下注解,让注入变成选择性的,如果目标View存在,则注入, 不存在,则什么事情都不做。
参考文档:
http://jakewharton.github.io/butterknife/
https://blog.csdn.net/qq_29924041/article/details/80538360
网友评论