Android——ButterKnife--View注入框架
2015-11-13 11:04
429 查看
前言
本文中大部分示例都是Butter Knife官网直接拿来的,本文就是官方翻译版加了很少量的说明。可以直接去官网看教程
。
加入android studio 项目中(目前我使用的版本是7.0.1)
另外还需要在build.gradle 配置两个地方
中配置一下混淆文件:
用法:
(1)简单绑定使用
注:
ButterKnife可不是通过反射实现了,而是在编译的时候生成的代码,和我们自己写的其实原理一样,比如上面的Button的绑定的实现就类似下面的方法:
(2)绑定资源使用
比如说
经常会在Adapter中使用ViewHolder,其实你也可以在ViewHolder中使用ButterKnife:
在ViewHolder的构造函数中调用
。
如果我们有一系列的View放到了一个List里面,就可以进行批量操作了:批量绑定,批量设置属性等。
其中,
An
Android
also be used with the
(6) 绑定监听
多个View也可以绑定到一个处理方法上:
(7)绑定重置
如果我们需要取消绑定的View,ButterKnife提供了一个
方法给我们使用。
还可以通过
本文中大部分示例都是Butter Knife官网直接拿来的,本文就是官方翻译版加了很少量的说明。可以直接去官网看教程
。
官网及文档:http://jakewharton.github.io/butterknife/ GitHub地址:https://github.com/JakeWharton/butterknife </span>
加入android studio 项目中(目前我使用的版本是7.0.1)
compile 'com.jakewharton:butterknife:(insert latest version)'
另外还需要在build.gradle 配置两个地方
//支持lint warning 检查机制 lintOptions { disable 'InvalidPackage' } //为什么加入这个呢?防止冲突,比如我同时用了dagger-compiler就会报错,说下面这个`Processor`重复了 packagingOptions { exclude 'META-INF/services/javax.annotation.processing.Processor' }顺便在Proguard
中配置一下混淆文件:
-keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * { @butterknife.* <fields>; } -keepclasseswithmembernames class * { @butterknife.* <methods>; }</span>
用法:
(1)简单绑定使用
class ExampleActivity extends Activity { @Bind(R.id.title) TextView title; @Bind(R.id.subtitle) TextView subtitle; @Bind(R.id.footer) TextView footer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_activity); ButterKnife.bind(this); // TODO Use fields... } }
注:
ButterKnife可不是通过反射实现了,而是在编译的时候生成的代码,和我们自己写的其实原理一样,比如上面的Button的绑定的实现就类似下面的方法:
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)绑定资源使用
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 // ... }(3) 非Activity的绑定
比如说
Fragment中(得到
View,然后
bind方法传入这个
View的实例):
public class FancyFragment extends Fragment { @Bind(R.id.button1) Button button1; @Bind(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; } }(4) 在Adapter的绑定
经常会在Adapter中使用ViewHolder,其实你也可以在ViewHolder中使用ButterKnife:
在ViewHolder的构造函数中调用
bind,然后成员变量同样的使用
@Bind注解,原理都是差不多的
。
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("Hello,android"); // etc... return view; } static class ViewHolder { @Bind(R.id.title) TextView name; @Bind(R.id.job_title) TextView jobTitle; public ViewHolder(View view) { ButterKnife.bind(this, view); } } }(5)View List 批量操作
如果我们有一系列的View放到了一个List里面,就可以进行批量操作了:批量绑定,批量设置属性等。
<span style="font-size:18px;">@Bind({ R.id.first_name, R.id.middle_name, R.id.last_name }) List<EditText> nameViews;</span>
<span style="font-size:18px;">//批量设置 ButterKnife.apply(nameViews, DISABLE); ButterKnife.apply(nameViews, ENABLED, false);</span>
其中,
DIABLE,
ENABLED是定义的两个对象,一个是Action,负责执行操作,一个是Setter,负责将值设置为第三个参数:
<span style="font-size:18px;">tatic 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); } };</span>
An
Android
Propertycan
also be used with the
applymethod.
<span style="font-size:18px;">ButterKnife.apply(nameViews, View.ALPHA, 0.0f);</span>
(6) 绑定监听
@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!"); }
多个View也可以绑定到一个处理方法上:
<span style="font-size:18px;">@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(); } }</span>如果是自定义视图 ,可以通过不指定一个ID 绑定到其自己的侦听器。
<span style="font-size:18px;">public class FancyButton extends Button { @OnClick public void onClick() { // TODO do something! } }</span>
(7)绑定重置
如果我们需要取消绑定的View,ButterKnife提供了一个
unbind
方法给我们使用。
public class FancyFragment extends Fragment { @Bind(R.id.button1) Button button1; @Bind(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; } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.unbind(this); } }
还可以通过
findById函数来简化查找View方法。
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);
相关文章推荐
- 使用TextView实现跑马灯效果
- androidStudio 中jar包制作
- jenkins gradle android
- SwipeRefreshLayout简单使用
- Android学习之动画
- Android解决ViewPager嵌套Fragment,Fragment嵌套ViewPager滑动冲突
- 分分钟学习编写高效的 Android 代码
- Android studio 中 Project Structure 的使用
- 【Android】RecyclerView卡顿问题jerky
- Android安全专项测试之反编译
- Android之计算缓存大小并且清空缓存
- Android Studio常用快捷键-mac版
- android自定义CheckBox和RadioButton中文字和图片之间距离问题解决
- 深入Android开发之--理解View#onTouchEvent
- Android 中Canvas.drawBitmap()的使用
- android刮刮乐
- android studio 集成开发环境的安装配置和使用
- Android Studio显示代码行数
- Android获取经纬度
- 给 Android 开发者的 RxJava 详解