对于ButterKnife类官方的解释是:
Field and method binding for Android views. Use this class to simplify finding views and attaching listeners by binding them with annotations.
翻译过来就是:
Android视图的字段和方法绑定。使用此类通过将视图与注释绑定来简化查找视图和附加侦听器。
原生的获取组件是这样的:
public class MainActivity extends AppCompatActivity { //定义组件 private TextView main_tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); main_tv = findViewById(R.id.main_tv);//获取组件 main_tv.setText("111");//使用组件 } }
而使用 Butter Knife后的获取组件是这样子的:
public class MainActivity extends AppCompatActivity { @BindView(R.id.main_tv) private TextView main_tv;//定义并获取组件 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); //绑定activity main_tv.setText("111");//使用组件 } }
Butter Knife(小刀注解) 优点:
1、View绑定和Click事件处理功能,简化代码
2、方便处理Adapter里的ViewHolder绑定问题
3、运行时不会影响APP效率,使用配置方便
而今天遇到了一个在UI控件的上方使用该注解的情况。
注解的控件变量必须是public,否则报错。
@BindView(R.id.tracking_locus_btn) ImageButton mLocusBtn;
那这个注解有什么用呢?
代替了findViewById方法。也就是说你不用再去每个控件都去find一遍了。
点开这个注解你会发现~
import android.support.annotation.IdRes; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.RetentionPolicy.CLASS; /** * Bind a field to the view for the specified ID. The view will automatically be cast to the field * type. * <pre><code> * {@literal @}BindView(R.id.title) TextView title; * </code></pre> */ @Retention(CLASS) @Target(FIELD) public @interface BindView { /** View ID to which the field will be bound. */ @IdRes int value(); }
然后再创建一个注解处理器,当然只求会用的话,下面这个你也可以不看。
package com.example.zhujie; import android.app.Activity; import android.view.View; import java.lang.reflect.Field; //创建注解处理器 public class InjectUtils { public static void inject(Activity activity) throws IllegalAccessException { Field[] fields = activity.getClass().getDeclaredFields(); for (Field field : fields) { BindView bindView = field.getAnnotation(BindView.class); if (bindView != null) { int value = bindView.value(); View view = activity.findViewById(value); try { field.set(activity, view); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } }
ButterKnife.bind(this);
参数就是传入当前页面的Activity。
然后使用set方法调整UI控件即可。
但是!
你如果在java代码中绑定了一个控件
但是你却没有使用,界面就会崩溃。
还有!
如果你在onClick方法想要用点击事件,那么也要在onClick方法上面加一个注解,注解的内容就是控件的ID。
@OnClick({R.id.tracking_car_btn, R.id.tracking_mobile_btn}) public void onClick(View v) {}
这个大佬写的很不错