都说程序员都是比较懒的,什么事情都想着让程序自动化帮忙减轻工作量,这个开源库可以让我们从大量的findViewById()和setonclicktListener()解放出来,其对性能的影响微乎其微(查看过Butter Knife的源码,其自定义注解的实现都是限定为RetentionPolicy.CLASS,也就是到编译出.class文件为止有效,在运行时不额外消耗性能,其是通过java注解自动生成java代码的形式来完成工作),其也有一个明显的缺点,那就是代码的可读性差一些,但了解了之后,上手也很快。。。
转载:推荐一个Android开发懒人库 -- ButterKnife
官网:Butter Knife
1. 使用方法(以Android Studio为例)
打开build.gradle(Module:app),在dependencies中添加
compile 'com.jakewharton:butterknife:7.0.1'
(ButterKnife7.0以下使用InjectView,ButterKnife7.0使用Bind,ButterKnife8.0使用BindView,亲测ButterKnife8.0以上运行过程会报错,解决方法比较麻烦,这里就拿7.0.1的举例,想要需求8.0解决方法的可以自行寻找)
2. 解放控件实例化
- 未使用ButterKnife的写法:
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
textView.setText("Hello ButterKnife");
}
}
- 使用ButterKnife的写法:
public class MainActivity extends AppCompatActivity {
@Bind(R.id.textView) TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
textView.setText("Hello ButterKnife");
}
}
ps: ButterKnife.bind(this);在一个Activity里只需要执行一次即可,如果是在Fragment或者Adapter,需要多加一个root view参数,如:
public class FancyFragment extends Fragment {
@Bind(R.id.button) Button button;
@Override 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 void onDestroyView() {
super.onDestroyView();
ButterKnife.reset(this);
}
}
3. 解放监听添加
- 未使用ButterKnife的写法:
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
click();
}
});
}
private void click(){
Log.i("textView", "click");
}
}
- 使用ButterKnife的写法:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@OnClick(R.id.textView)
private void click(){
Log.i("textView", "click");
}
}
是不是简洁很多了,还可以批量为多个控件添加为同一个响应函数:
@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();
}
}
还可以用于多方法的listener(Multi-method Listeners)
@OnItemSelected(R.id.my_spinner) //default callback : ITEM_SELECTED
void onItemSelected(int position) {
Toast.makeText(this, "position: " + position, Toast.LENGTH_SHORT).show();
}
4. Zelezny插件的使用
在AndroidStudio->File->Settings->Plugins->搜索Zelezny下载添加就行 ,可以快速生成对应组件的实例对象,不用手动写。使用时,在要导入注解的Activity 或 Fragment 或 ViewHolder的layout资源代码上,右键—>Generate—>Generate ButterKnife Injections,然后就出现如图的选择框。
哈哈,ButterKnife的介绍暂且到这里了,希望对“懒”程序员有所帮助。
网友评论