博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 之ButterKnife注解使用
阅读量:4206 次
发布时间:2019-05-26

本文共 5416 字,大约阅读时间需要 18 分钟。

1.)在Project的build.gradle中添加如下配置

buildscript {  repositories {    mavenCentral()   }  dependencies {    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'  }}

2.)在Module的build.gradle添加如下配置

apply plugin: 'com.neenbedankt.android-apt'android {  ...}dependencies {  compile 'com.jakewharton:butterknife:8.1.0'  apt 'com.jakewharton:butterknife-compiler:8.1.0'}

3.)注入和重置注入

Activity:

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); // TODO Use fields... }}

Fragment:

由于不同的视图生命周期,所以需要在onCreateView bind,在onDestroyView 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(); }}

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); } }}

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
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

@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() {  //  }

9.)ButterKnife.apply()函数

可以通过ButterKnifeapply()函数对view集合元素或者单个view的Action, Setter和Property进行修改

ButterKnife.apply(nameViews, DISABLE);ButterKnife.apply(nameViews, ENABLED, false);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); }};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);

转载地址:http://qvqli.baihongyu.com/

你可能感兴趣的文章
HP Sprinter:敏捷加速器
查看>>
单元测试培训PPT
查看>>
adb常用命令
查看>>
通过LR监控Linux服务器性能
查看>>
通过FTP服务的winsockes录制脚本
查看>>
LRwinsocket协议测试AAA服务器
查看>>
Net远程管理实验
查看>>
反病毒专家谈虚拟机技术 面临两大技术难题
查看>>
几种典型的反病毒技术:特征码技术、覆盖法技术等
查看>>
性能测试一般过程与LR性能测试过程
查看>>
Software Security Testing软件安全测试
查看>>
SQL注入漏洞全接触--进阶篇
查看>>
SQL注入漏洞全接触--高级篇
查看>>
SQL注入法攻击一日通
查看>>
论文浅尝 | 通过共享表示和结构化预测进行事件和事件时序关系的联合抽取
查看>>
论文浅尝 | 融合多粒度信息和外部语言知识的中文关系抽取
查看>>
论文浅尝 | GMNN: Graph Markov Neural Networks
查看>>
廖雪峰Python教程 学习笔记3 hello.py
查看>>
从内核看epoll的实现(基于5.9.9)
查看>>
python与正则表达式
查看>>