黄沙百战穿金甲,不破楼兰终不还。这篇文章主要讲述Android框架式编程之BufferKnife相关的知识,希望能为你提供帮助。
本文目录:
- 2.1 基本用法
- 2.2 资源绑定
- 2.3 监听绑定
- 2.4 绑定重置
- 2.5 可选绑定
- 2.6 多方法监听器
- 2.7 Bonus
一、配置
compile \'com.jakewharton:butterknife:(insert latest version)\' annotationProcessor \'com.jakewharton:butterknife-compiler:(insert latest version)\'
二、使用android 开发过程中,我们需要写大量的findViewById()和setonclicktListener()等事件, 那么现在有一个框架可以很好的解决这个问题 ---- BufferKnife。BufferKnife可以大量精简代码,而且不影响性能,可以通过查看Butter Knife了解到,其自定义注解的实现都是限定为RetentionPolicy.CLASS,也就是到编译出.class文件为止有效,在运行时不会额外消耗性能。
2.1 基本用法
文章图片
class ExampleActivity extends Activity { @BindView(R.id.title) TextView title; @BindView(R.id.subtitle) TextView subtitle; @BindView(R.id.footer) TextView footer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_activity); ButterKnife.bind(this); // 必须在设置好布局事件后绑定当前的Activity // TODO Use fields... } }
文章图片
上面的慢反射代码执行下来生成的class代码如下:
public void bind(ExampleActivity activity) { activity.subtitle = (android.widget.TextView) activity.findViewById(2130968578); activity.footer = (android.widget.TextView) activity.findViewById(2130968579); activity.title = (android.widget.TextView) activity.findViewById(2130968577); }
2.2 资源绑定可以使用
@BindBool
,
@BindColor
,
@BindDimen
,
@BindDrawable
,
@BindInt
,
@BindString来预绑定一些资源到对应的字段。
文章图片
class ExampleActivity extends Activity { @BindString(R.string.title) String title; @BindDrawable(R.drawable.graphic) Drawable graphic; @BindColor(R.color.red) int red; // int or ColorStateList field @BindDimen(R.dimen.spacer) Float spacer; // int (for pixel size) or float (for exact value) field // ... }
文章图片
那么有人会问,非Activity的类如何绑定呢?其实只需要比Activity绑定时多传递一个参数即可,即根View:
文章图片
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; } }
文章图片
Butter Knife 还有另一个用途就是简化List的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); } } }
文章图片
基本上你想调用findViewById的方法的地方应该都是可以设置ButterKnife.bind的。
使用ButterKnife.bind(这)将视图的孩子绑定到字段中。 如果您在布局中使用< merge> 标签,并在自定义视图构造函数中展开,则可以立即调用它。 或者,从XML扩展的自定义视图类型可以在onFinishInflate()回调中使用它。
提供的其他的绑定的APIs:
- 使用Activity作为视图根来绑定任意对象。如果你使用类似MVC 的模式,你可以使用ButterKnife.bind(this, activity)来绑定控制器。
你可以将多个view分组到List或者Array:
@BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name }) List< EditText> nameViews;
ButterKnife提供的apply方法能够让你一次性对列表中的所有视图进行操作。
ButterKnife.apply(nameViews, DISABLE); ButterKnife.apply(nameViews, ENABLED, false);
ButterKnife的Action
和
Setter
接口允许你做一些特定的操作。文章图片
static final ButterKnife.Action< View> DISABLE = new ButterKnife.Action< View> () { @Override public void apply(View view, int index) { view.setEnabled(false); } }; static final ButterKnife.Setter< View, Boolean> ENABLED = new ButterKnife.Setter< View, Boolean> () { @Override public void set(View view, Boolean value, int index) { view.setEnabled(value); } };
文章图片
Anroid的一些属性也可以和apply方法一起使用。
ButterKnife.apply(nameViews, View.ALPHA, 0.0f);
2.3 监听绑定使用ButterKnife可以自动将监听配置到方法上。如下:
@OnClick(R.id.submit) public void submit(View view) { // TODO submit data to server... }
监听方法的参数是可选的。如下:
@OnClick(R.id.submit) public void submit() { // TODO submit data to server... }
定义一个特定的类型, 它能够被自动转换。如下:
@OnClick(R.id.submit) public void sayHi(Button button) { button.setText("Hello!"); }
一次绑定可以处理多个事件:
文章图片
@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(); } }
文章图片
自定义Views可以不同指定ID来绑定到自己的监听器:
public class FancyButton extends Button { @OnClick public void onClick() { // TODO do something! } }
2.4 绑定重置Fragments和Activity有不同的生命周期。在fragment的onCreateView绑定了之后,要在onDestroyView中置为null。BufferKnife在你调用了bind之后返回给了你一个Unbinder实例。你需要做的事情就是在适当的生命周期内调用unbind方法。
文章图片
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.5 可选绑定默认情况下,@Bind和监听器绑定都是必需的。 如果找不到目标视图,将抛出异常。
要抑制此行为并创建可选绑定,请将@Nullable注释添加到字段或将@Optional注释添加到方法中。
注意:任何名为@Nullable的注释都可用于字段。 我们鼓励使用Android的“支持注释”库中的@Nullable注释。
@Nullable @BindView(R.id.might_not_be_there) TextView mightNotBeThere; @Optional @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() { // TODO ... }
2.6 多方法监听器方法注释,其相应的侦听器具有多个回调,可以用于绑定到任何一个。 每个注释都有一个默认的回调,它绑定到。 使用回调参数指定备用。
文章图片
@OnItemSelected(R.id.list_view) void onItemSelected(int position) { // TODO ... }@OnItemSelected(value = https://www.songbingjia.com/android/R.id.maybe_missing, callback = NOTHING_SELECTED) void onNothingSelected() { // TODO ... }
文章图片
2.7 Bonus还包括findById方法,它简化了仍然必须在View,Activity或Dialog上查找视图的代码。 它使用泛型来推断返回类型并自动执行转换。
View view = LayoutInflater.from(context).inflate(R.layout.thing, null); TextView firstName = ButterKnife.findById(view, R.id.first_name); TextView lastName = ButterKnife.findById(view, R.id.last_name); ImageView photo = ButterKnife.findById(view, R.id.photo);
为ButterKnife.findById添加静态导入,并享受更多乐趣。
参考资料:https://www.jianshu.com/p/3678aafdabc7
【Android框架式编程之BufferKnife】
分类: Android 框架式编程 https://www.cnblogs.com/renhui/p/6900048.html
推荐阅读
- [本地存储值]ApplicationSettingsBase运用
- [linux mint]Win7 + Linux mint安装(含eclipseericandroid studiopycharm等安装)
- 新鲜出炉高仿网易云音乐 APP
- webApp实战开发,仿网易新闻webApp
- Android中的转场动画以及material-components-android 使用
- nginx + gunicorn + supervisor + flask+virtualenvwrapper
- uniapp navigator url 传参方法
- 关于小米手机安装APP总是提示“与已安装应用签名不同”的问题
- uni-app组件的生命周期 / and 页面生命周期