黄油刀——ButterKnife
Posted 春招进大厂的梦想家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黄油刀——ButterKnife相关的知识,希望对你有一定的参考价值。
黄油刀——ButterKnife
前言:
ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤.最重要的一点,使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。。
-
ButterKnife的优势:
1、强大的View绑定和Click事件处理功能,简化代码,提升开发效率;
2、方便的处理Adapter里的ViewHolder绑定问题;
3、运行时不会影响APP效率,使用配置方便;
4、代码清晰,可读性强;
一、注册
1.注册:
dependencies {
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0'
}
在build.gradle文件下进行导入;
2.绑定:
- Activty进行绑定:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//进行黄油刀的绑定
ButterKnife.bind(this);
}
-
Fagemnt进行绑定:
public class ButterknifeFragment extends Fragment{ private Unbinder unbinder; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment, container, false); //返回一个Unbinder值(进行解绑),注意这里的this不能使用getActivity() unbinder = ButterKnife.bind(this, view); return view; } /** * onDestroyView中进行解绑操作 */ @Override public void onDestroyView() { super.onDestroyView(); unbinder.unbind(); } }
-
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.testlayout, parent, false); holder = new ViewHolder(view); view.setTag(holder); } holder.name.setText("Donkor"); holder.job.setText("android"); // etc... return view; } static class ViewHolder { @BindView(R.id.title) TextView name; @BindView(R.id.job) TextView job; public ViewHolder(View view) { ButterKnife.bind(this, view); } } }
二、使用
1.绑定控件:
ImageView imageView;
GridLayout gridLayout;
Button btnChange;
Button btnReset;
Button btnGray;
Button btnReverse;
Button btnNostalgia;
Button btnDiscoloration;
Button btnHighSaturation;
Button btnNegative;
Button btnOldImage;
像这种有很多的控件的时候,按照传统的方法需要findviewByID来一个个找到控件,很浪费时间,代码也不美丽。
那么让我们使用黄油刀吧
public class MainActivity extends AppCompatActivity {
@BindView(R.id.image_view)
ImageView imageView;
@BindView(R.id.grid_layout)
GridLayout gridLayout;
@BindView(R.id.btn_change)
Button btnChange;
@BindView(R.id.btn_reset)
Button btnReset;
@BindView(R.id.btn_gray)
Button btnGray;
@BindView(R.id.btn_reverse)
Button btnReverse;
@BindView(R.id.btn_nostalgia)
Button btnNostalgia;
@BindView(R.id.btn_discoloration)
Button btnDiscoloration;
@BindView(R.id.btn_high_saturation)
Button btnHighSaturation;
@BindView(R.id.btn_negative)
Button btnNegative;
@BindView(R.id.btn_old_image)
Button btnOldImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
这样加一个注释就找到了,很方便,代码量比起之前也少了很多。
2.绑定资源:
@BindString(R2.string.app_name) //绑定资源文件中string字符串
String str;
@BindView( R2.id.imageView ) //绑定ImageView 控件
public ImageView imageView ;
@BindBitmap( R2.mipmap.bm)//绑定Bitmap 资源
public Bitmap bitmap ;
3.绑定颜色值:
@BindColor( R2.color.colorAccent ) //具体色值在color文件中 int black ; //绑定一个颜色值
4.事件绑定:
public class MainActivity extends AppCompatActivity { @OnClick(R2.id.button1 ) //给 button1 设置一个点击事件 public void showToast(){ Toast.makeText(this, "is a click", Toast.LENGTH_SHORT).show(); } @OnLongClick( R2.id.button1 ) //给 button1 设置一个长按事件 public boolean showToast2(){ Toast.makeText(this, "is a long click", Toast.LENGTH_SHORT).show(); return true ; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //绑定activity ButterKnife.bind( this ) ; } }
-
绑定多个事件:
public class MainActivity extends AppCompatActivity { //Tip:当涉及绑定多个id事件时,我们可以使用Android studio的Butterknife //插件zelezny快速自动生成的,之后在下面会有介绍安装插件与使用 @OnClick({R.id.ll_product_name, R.id.ll_product_lilv, R.id.ll_product_qixian, R.id.ll_product_repayment_methods}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.ll_product_name: System.out.print("我是点击事件1"); break; case R.id.ll_product_lilv: System.out.print("我是点击事件2"); break; case R.id.ll_product_qixian: System.out.print("我是点击事件3"); break; case R.id.ll_product_repayment_methods: System.out.print("我是点击事件4"); break; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //绑定activity ButterKnife.bind( this ) ; } }
5.更多绑定注解:
@BindView—->绑定一个view;id为一个view 变量
@BindViews —-> 绑定多个view;id为一个view的list变量
@BindArray—-> 绑定string里面array数组;@BindArray(R.array.city ) String[] citys ;
@BindBitmap—->绑定图片资源为Bitmap;@BindBitmap( R.mipmap.wifi ) Bitmap bitmap;
@BindBool —->绑定boolean值
@BindColor —->绑定color;@BindColor(R.color.colorAccent) int black;
@BindDimen —->绑定Dimen;@BindDimen(R.dimen.borth_width) int mBorderWidth;
@BindDrawable —-> 绑定Drawable;@BindDrawable(R.drawable.test_pic) Drawable mTestPic;
@BindFloat —->绑定float
@BindInt —->绑定int
@BindString —->绑定一个String id为一个String变量;@BindString( R.string.app_name ) String meg;
▲ 更多事件注解:
@OnClick—->点击事件
@OnCheckedChanged —->选中,取消选中
@OnEditorAction —->软键盘的功能键
@OnFocusChange —->焦点改变
@OnItemClick item—->被点击(注意这里有坑,如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false)
@OnItemLongClick item—->长按(返回真可以拦截onItemClick)
@OnItemSelected —->item被选择事件
@OnLongClick —->长按事件
@OnPageChange —->页面改变事件
@OnTextChanged —->EditText里面的文本变化事件
@OnTouch —->触摸事件
三、使用注意事项;
- 在Activity 类中绑定 :ButterKnife.bind(this);必须在setContentView();之后绑定;且父类bind绑定后,子类不需要再bind。
- 在非Activity 类(eg:Fragment、ViewHold)中绑定: ButterKnife.bind(this,view);这里的this不能替换成getActivity()
- 在Activity中不需要做解绑操作,在Fragment 中必须在onDestroyView()中做解绑操作。
- 使用ButterKnife修饰的方法和控件,不能用private or static 修饰,否则会报错。错误: @BindView fields must not be private or static. (com.zyj.wifi.ButterknifeActivity.button1)
- 使用Activity为根视图绑定任意对象时,如果你使用类似MVC的设计模式你可以在Activity 调用ButterKnife.bind(this, activity),来绑定Controll
- 使用ButterKnife.bind(this,view)绑定一个view的子节点字段。如果你在子View的布局里或者自定义view的构造方法里 使用了inflate,你可以立刻调用此方法。或者,从XML inflate来的自定义view类型可以在onFinishInflate回调方法中使用它
以上是关于黄油刀——ButterKnife的主要内容,如果未能解决你的问题,请参考以下文章
Android Butterknife(黄油刀) 使用方法总结
android studio中library使用butterknife(黄油刀)注解方法