ButterKnife 8.1.0 入门详解
来源:互联网 发布:怎么把淘宝差评师杀了 编辑:程序博客网 时间:2024/06/05 15:29
先不管他怎么用, 我们先把他弄到我们的项目里,自己学的时候费了很大的功夫,现在参考一些大神的文章,加上自己学习遇到的问题来记录一下:
1、在project的build.gradle中添加这么一句话
//依赖包的定义dependencies { classpath 'com.android.tools.build:gradle:2.2.1' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'//要添加的 }
2、在app的build.gradle中进行配置
1)首先添加构建项目的类型
apply plugin: 'com.neenbedankt.android-apt'
2)添加依赖
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.jakewharton:butterknife:8.1.0' //加这样的一句 apt 'com.jakewharton:butterknife-compiler:8.1.0'//添加这个}
注意:
下面的是我从网上直接复制粘贴的,
compile ‘com.jakewharton:butterknife:8.0.1’
apt ‘com.jakewharton:butterknife-compiler:8.1.0’
这里一个是8.1.0一个是8.0.1要保证这两个一致,否则会报如下错的
Error:(24, 32) 错误: 找不到符号
符号: 方法 findRequiredViewAsType(Object,int,String,Class)
位置: 类型为Finder的变量 finder
解决ButterKnife 8.1的依赖问题
3、配置好 “环境” 后就要使用了
注意:使用ButterKnife注解的属性和方法不能用private和static修饰,否则会报错的!!!
1、Activity中的简单实用
public class MainActivity extends AppCompatActivity { @BindView(R.id.hello) TextView helloView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //这里要要注意了,一定要在setContentView之后 ButterKnife.bind(this); helloView.setText("看看成功没!"); }}
2、如果是在Fragment中使用有一点不同要注意
由于不同的视图生命周期,所以需要在onCreateView bind,在onDestroyView unbind。
Butter Knife提供了bind的几个重载,只要传入跟布局,便可以在任何对象中使用注解绑定。
public class FancyFragment extends Fragment { @BindView(R.id.button1) Button button1; 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); return view; } @Override public void onDestroyView() { super.onDestroyView(); unbinder.unbind(); }}
3、在ListView和RecyclerView的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("哈哈"); return view; } static class ViewHolder { @BindView(R.id.title) TextView name; public ViewHolder(View view) { ButterKnife.bind(this, view); } }}
4、view注入 @BindView,@BindViews
@BindView(R.id.btn_butter_knife)Button butterKnifeBtn; @BindViews({R.id.tv_butter_knife1,R.id.tv_butter_knife2,R.id.tv_butter_knife3})List<TextView> textViews;
5、Resource注入
@BindString(R.string.title_btn_butter_knife) String butterKnifeStr;//string注解使用 @BindDrawable(R.mipmap.ic_launcher) Drawable butterKnifeDrawable;//Drawable注解使用 @BindBitmap(R.mipmap.ic_launcher) Bitmap butterKnifeBitmap;;//Bitmap注解使用 @BindArray(R.array.day_of_week) String weeks[];//数组 @BindColor(R.color.colorPrimary) int colorPrimary;//color注解使用 @BindDimen(R.dimen.activity_horizontal_margin) Float spacer;
6、单事件注入
一个控件指定一个事件回调
/** * 不带参数 */ @OnClick(R.id.btn_butter_knife) public void onButterKnifeBtnClick() { } /** * 带参数 */ @OnClick(R.id.btn_butter_knife) public void onButterKnifeBtnClick(View view) { Log.e(TAG, "onButterKnifeBtnClick"); } /** * 带参数 * @param button */ @OnClick(R.id.btn_butter_knife) public void onButterKnifeBtnClick(Button button) { Log.e(TAG, "onButterKnifeBtnClick"); }
也可以多个控件指定一个事件回调
/** * 两个不同的button都相应onButterKnifeBtnClick事件回调 * * @param button */ @OnClick({R.id.btn_butter_knife, R.id.btn_butter_knife1}) public void onButterKnifeBtnClick(Button button) { Log.e(TAG, "onButterKnifeBtnClick"); }
自定义的控件不通过ID也可以绑定到自己的事件
public class FancyButton extends Button { @OnClick public void onClick() { // TODO do something! }}
7、多事件注入
有一些View的listener是有多个回调方法的,比如EditText添加addTextChangedListener
editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { } });
可以使用注解方式改成如下
@OnTextChanged(value = R.id.nameEditText, callback = OnTextChanged.Callback.BEFORE_TEXT_CHANGED) void beforeTextChanged(CharSequence s, int start, int count, int after) { } @OnTextChanged(value = R.id.nameEditText, callback = OnTextChanged.Callback.TEXT_CHANGED) void onTextChanged(CharSequence s, int start, int before, int count) { } @OnTextChanged(value = R.id.nameEditText, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED) void afterTextChanged(Editable s) { }
8、选择注入
默认情况下,@Bind 和listener的注入都是必须的,如果target view没有被发现,则会报错. 为了抑制这种行为,可以用@Optional注解来标记field和方法,让注入变成选择性的,如果targetView存在,则注入, 不存在,则什么事情都不做.或者使用 Android’s “support-annotations” library.中的@Nullable来修饰
@Nullable @BindView(R.id.might_not_be_there)TextView mightNotBeThere;@Optional @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() { // TODO ...}
9、ButterKnife.apply()函数
ButterKnife.apply(nameViews, DISABLE);ButterKnife.apply(nameViews, ENABLED, false);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); }};ButterKnife.apply(nameViews, View.ALPHA, 0.0f);
10、ButterKnife.findById()
ButterKnife 也提供了findById函数,通过findById()可以获取Activity、Dialog、View中的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);
4、BufferKnife 自动生成插件安装:
在AndroidStudio->File->Settings->Plugins->搜索Zelezny下载添加就行 ,可以快速生成对应组件的实例对象,不用手动写。使用时,在要导入注解的Activity 或 Fragment 或 ViewHolder的layout资源代码上,右键——>Generate——Generate ButterKnife Injections,然后就出现如图的选择框。
- ButterKnife 8.1.0 入门详解
- ButterKnife详解
- butterknife 详解
- ButterKnife详解
- Butterknife详解
- 【butterknife】butterknife:8.4.0 黄油刀使用详解。
- 关于butterknife:8.4.0使用详解。
- ButterKnife 8.1.0 空指针
- ButterKnife:8.1.0的使用
- ButterKnife:8.1.0的使用
- ButterKnife:8.1.0的使用
- ButterKnife使用详解
- ButterKnife框架使用详解
- butterknife 注解详解
- ButterKnife使用详解
- ButterKnife的使用详解
- Butterknife使用详解
- ButterKnife使用详解
- Xn数列(矩阵乘法+快速幂+慢速乘法)
- Android的layout_weight的含义
- UIVIewController自定义切换效果
- 什么时候用阻止事件冒泡
- 消息中间件原理及JMS简介
- ButterKnife 8.1.0 入门详解
- ServletContextListener使用详解
- 空分多址——SDMA
- Sql 之SELECT INTO 与 INSERT INTO SELECT
- 自定义控件——开关按钮ToggleButton
- 阻塞(sleep等等)区别 中断(interrupt)+ 中断的意义
- Java_03
- cer, pfx 创建,并且读取公钥/密钥,加解密 (C#程序实现)
- 文章标题