现在的Android开发框架层出不穷,我们必须要学点什么来为自己加速。
该刀的Github地址: https://github.com/JakeWharton/butterknife
该刀法的解读时间为 2016/11/17,当时该刀版本为8.4.0。
优势:
在app的build.gradle里配置
dependencies {
compile ‘com.jakewharton:butterknife:8.4.0’
annotationProcessor ‘com.jakewharton:butterknife-compiler:8.4.0’
}
然后在mark一下就搞定了。
@BindView
public class MainActivity extends AppCompatActivity {
@BindView(R.id.title)
TextView title;
@BindView(R.id.button)
Button button;
@BindView(R.id.imageView)
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
}
该刀(Butter Knife)会自动帮你完成转换类型。 2.资源的绑定
@BindString()
@BindInt()
@BindFloat()
@BindDimen()
@BindDrawable()
@BindArray()
@BindBitmap()
@BindBool()
@BindColor()
- 1.2
BindDrawable(value = R.drawable.placeholder, tint = R.attr.colorAccent)
具体用法大同小异,不再写出。
Fragment
可以通过target+rootView进行任意的绑定
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
也可以通过target+rootView进行任意的绑定
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("我的刀呢?");
//...
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
例:
@BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name })
List nameViews;
apply()
该方法可以让多个视图一块进行一个操作
例:
static final ButterKnife.Action DISABLE = new ButterKnife.Action() {
@Override public void apply(View view, int index) {
view.setEnabled(false);
}
};
static final ButterKnife.Setter ENABLED = new ButterKnife.Setter() {
@Override public void set(View view, Boolean value, int index) {
view.setEnabled(value);
}
};
//do...
ButterKnife.apply(nameViews, DISABLE);
ButterKnife.apply(nameViews, ENABLED, false);
Action:
不带参数的多视图处理
Setter:
可携带一个参数的多视图处理
Property:
android的属性也可以进行一起使用
例:ButterKnife.apply(nameViews, View.ALPHA, 0.0f);
该刀(Butter Knife)的多视图的统一处理方法:
ButterKnife.apply();
@OnClick()
似乎有那么一丢丢的略屌。
君甚屌.
把多个视图的单击事件绑定到一个方法上
@OnClick({id1,id2,id3})
半行代码,绑定了多个视图的单击事件。
直接在View内部注解即可
有的回调中会有多个方法,我们可以为他们中的每一个进行绑定。
文末会列出andoird中多回调方法的callback类型集合,便于查找。
当然,在编码中会有相应的提示,便于选择。
例:
//请忽略报红部分
解读:
在多个回调方法监听中,使用value指定控件id,callback指定具体回调的方法。
我们来看一下注解后面的东西。
它里面有一个Enum类型的Callback,里面定义了监听方法的名字和参数的类型以及这个监听方法在刀法中的名称。
通常情况下,@Bind…和绑定监听器都是必须的。如果找不到目标的话,将抛出异常。
为了避免抛出异常,可以创建一个可选的绑定,为View添加一个@Nullable注解或者为方法添加一个@Optional注解。
tip:@Nullable可以在任何时候用。
因为该刀(Butter Knife) It is encouraged to use the @Nullable annotation from Android’s “support-annotations” library.
因为Fragment与Activity的生命周期不同。当在onCreateView中绑定Fragment时,在onDestroyView中将会把视图销毁。所以我的刀(Butter Knife)在bind时会返回一个Unbinder实例。然后在适当的生命周期中调用其unbind()方法。同样Activity也适用,或者用其他合适的地方。
1.Fragment
public class FancyFragment extends Fragment {
@BindView(R.id.button1) Button button1;
@BindView(R.id.button2) Button button2;
private Unbinder unbinder;
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fancy_fragment, container, false);
unbinder = ButterKnife.bind(this, view);
// TODO Use fields...
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
2.Activity
参考: http://blog.csdn.net/itjianghuxiaoxiong/article/details/50177549
二、Activity部分
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.id.activity_main);
ButterKnife.bind(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ButterKnife.unbind(this);
}
}
在所有需要findviewById地方,都可以用刀法替代。
而且控件类型会自动转换
ButterKnife.findById(view,R.id.控件);
其背后的原理跟之前一直在使用的findView方法是一样的。
刀鞘的使用方法:
1. 在Activity的setContentView(R.layout.activity_main)后
2. 鼠标对准(R.layout.activity_main),右键单击。选择–>Generate–>选择黄油刀(Butter Knife)什么什么
3. 单击黄油刀后弹出一个关于你布局的绑定界面,可以自定名字,选择绑定的控件,是否加单击事件,是否生成ViewHolder等。
4. 点击Confirm生成。
@OnPageChange 页面变化监听
@OnTextChanged 文本变化监听
//暂未发现其他监听器。如果后面版本有添加了再补上。
一篇渣文,希望对您有所帮助。祝大家码到成功,操刀斩乱麻!