Android--Butter Knife

原创 2016年06月01日 16:40:28

github:https://github.com/JakeWharton/butterknife;
使用指南:http://jakewharton.github.io/butterknife/

ButterKnife 优势:
1.强大的View绑定和Click事件处理功能
2.方便的处理Adapter里的ViewHolder绑定问题

使用心得:
1.Activity 中ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind;
2.Fragment ButterKnife.bind(this, rootView);
3.属性不能用private or static 修饰,否则会报错

一:配置:
app–build.gradle

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

gradle–build.gradle

dependencies {
    classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}

二:使用:

text = (TextView) findViewById(R.id.text);
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

    }
});

可以写成:

@BindView(R.id.text)
TextView text;
@OnClick({R.id.text})
void Click() {
    Toast.makeText(this, "text", Toast.LENGTH_LONG).show();
}
public class MainActivity extends AppCompatActivity {
@BindView(R.id.text)
    TextView text;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
text = (TextView) findViewById(R.id.text);
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

            }
        });
}


@OnClick({R.id.text})
void Click() {
        Toast.makeText(this, "text", Toast.LENGTH_LONG).show();
}
}

目前是简单体验一下,接下来,我们讲解更多的使用方法:
1–Base:
ButterKnife.bind(this)需要与Activity绑定到一起,而绑定Activity 必须在setContentView之后:

public abstract class BaseActivity extends AppCompatActivity {
public abstract int getContentViewId();
    private Unbinder unbinder;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentViewId());
unbinder = ButterKnife.bind(this);
initViews(savedInstanceState);
}

protected abstract void initViews(Bundle bundle);

/**
     * 解除绑定
     */
@Override
protected void onDestroy() {
super.onDestroy();
unbinder.unbind();
}
}
public abstract class BaseFragment extends Fragment {
public abstract int getContentViewId();
    protected Context context;
    protected View rootView;
    private Unbinder unbinder;

@Nullable
    @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
rootView = inflater.inflate(getContentViewId(), container, false);
unbinder = ButterKnife.bind(this, rootView);
        this.context = getActivity();
initViews(savedInstanceState);
        return rootView;
}

protected abstract void initViews(Bundle bundle);

@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}

2–View:

@BindView(R.id.text)
TextView text;

@BindView(R.id.button)
Button button;

3–资源

@BindString(R.string.app_name)  
String appName;//sting  
@BindColor(R.color.red)  
int textColor;//颜色  
@BindDrawable(R.mipmap.ic_launcher)  
Drawable drawable;//drawble  
@Bind(R.id.imageview)  
ImageView mImageView;  
@Bind(R.id.checkbox)  
CheckBox mCheckBox;  
@BindDrawable(R.drawable.selector_image)  
Drawable selector;  

4–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");

    return view;
  }


staticclassViewHolder{
@BindView(R.id.title) 
TextView name;
@BindView(R.id.job_title)
TextView jobTitle;
publicViewHolder(View view){
         ButterKnife.bind(this, view);
}
}

5–绑定View集合:

@BindViews ({R.id.button,R.id.button2,R.id.button3})
List<Button> button;

6–批量处理事件:
—-批量处理View事件

ButterKnife.apply(button);
ButterKnife.apply(button, ENABLED,false);
ButterKnife.apply(button, View.ALPHA, 0.0f);

—设置统一处理:

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

7–View事件的监听:
–1:监听器参数可选

@OnClick({R.id.button})
void Click() {
    Toast.makeText(this, "text", Toast.LENGTH_LONG).show();
}
--2:
@OnClick({R.id.button})
void Click(View view) {
switch (view.getId()) {
case R.id.button:
            Toast.makeText(this, "text", Toast.LENGTH_LONG).show();
            break;
}

}

–3:定义一个类型,自动转换:

@OnClick({R.id.button})
void Click(Button btn) {
    btn.setText("onClick");
Toast.makeText(this, "text", Toast.LENGTH_LONG).show();
}

–4:继承View,也可使用监听:
—-自定义View,可以不指定ID,绑定自己的监听

public class CommitButton extends Button {
    public CommitButton(Context context) {
        super(context);
    }

    public CommitButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CommitButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    @OnClick
    void click(){

    }
}

三:空处理:
—-默认情况下,“绑定”和“监听”绑定都是必需的。如果不能找到目标视图,则将抛出异常。

@Nullable
@BindView(R.id.button)
Button button;
而针对事件监听处理:
@Optional
@OnClick(R.id.button)
void Click() {
    Toast.makeText(this, "text", Toast.LENGTH_LONG).show();
}

四:添加多回调方法的监听的使用方法,利用指定回调,实现想回调的方法
–1:listView:

@OnItemClick(value=R.id.listView)
void onItemSelected() {

}

@OnItemLongClick()
void onItemLongClick(ListView listView){

}

–2:EditText

@BindView(R.id.edit)
EditText edit;
@OnTextChanged(value = R.id.edit, callback = OnTextChanged.Callback.BEFORE_TEXT_CHANGED)
void beforeTextChanged(CharSequence s, int start, int count, int after) {

}
@OnTextChanged(value = R.id.edit, callback = OnTextChanged.Callback.TEXT_CHANGED)
void onTextChanged(CharSequence s, int start, int before, int count) {

}
@OnTextChanged(value = R.id.edit, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
void afterTextChanged(Editable s) {

}

以下是源码:可以看出,我们在正常使用某个方法的时候,系统都会提供和原生一样的参数供我们使用,所以,可以了解到我们在使用方法时,参数可以保持和原生方法参数一致并使用(其他控件方法也适用):

@Target(METHOD)
@Retention(CLASS)
@ListenerClass(
    targetType = "android.widget.TextView",
    setter = "addTextChangedListener",
    type = "android.text.TextWatcher",
    callbacks = OnTextChanged.Callback.class
)
public @interface OnTextChanged {
  @IdRes int[] value() default { View.NO_ID };

  Callback callback() default Callback.TEXT_CHANGED;

  enum Callback {
    @ListenerMethod(
        name = "onTextChanged",
        parameters = {
            "java.lang.CharSequence",
            "int",
            "int",
            "int"
        }
    )
    TEXT_CHANGED,
    @ListenerMethod(
        name = "beforeTextChanged",
        parameters = {
            "java.lang.CharSequence",
            "int",
            "int",
            "int"
        }
    )
    BEFORE_TEXT_CHANGED,
    @ListenerMethod(
        name = "afterTextChanged",
        parameters = "android.text.Editable"
    )
    AFTER_TEXT_CHANGED,
  }
}

五:在使用整体View,或者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);

完结:

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android注解使用之BufferKnife 8.0注解使用介绍

转载:http://www.cnblogs.com/whoislcj/p/5620128.html 前言:      App项目开发大部分时候还是以UI页面为主,这时我们需要调用大...

[Android] ButterKnife 浅析

前言自上星期写 Retrofit 写吐之后…我问大队长能不能换个其他什么东西写,大队长就说了个单词 ButterKnife,这个我知道,是黄油刀的意思,然后看到是减轻工作量的框架我就开心了,还在为 f...

ButterKnife使用详解

写在前面:该文档使用7.0版本,8.0版本方法名有所改动,建议看官方文档,整体业务逻辑和原理没什么变动,官网 在Android编程过程中,我们会写大量的布局和点击事件,像初始view、设置view监听...

ButterKnife(8.4.0版本)原理分析

注解

Android (Android Studio)adb启动失败 无法启动adb 解决方案

Android adb启动失败 无法启动adb 解决方案 下面是解决方案: 打开cmd--------------------------------------------------- 输入:  ...

三方Jar包、so文件和三方库导入步骤

步骤: 1、下载好需要的SDK包 2、找到对应的jar包和so文件(一般位于SDK包内的libs文件夹内) 3、将libs内的.jar文件复制到android studio的libs目录下,选中复...

Android RoboGuice开源框架、Butter Knife开源框架浅析

Google Guice on Android 今天介绍一下Google的这个开源框架RoboGuice, 它的作用跟之前讲过的Dagger框架几乎是一样的,只是Dagger比它的功能更强大一些。Da...

Android依赖注入类库 Butter Knife的使用

我们做移动端开发,每天写代码时几乎都会跟各种View打交道,大量的声明和findViewById()让人感到厌烦,但是又不得不写,今天给大家推荐一个第三方开源注解工具,ButterKnife,大家可自...

android stduio 中 butter knife的配置和使用

本文介绍butter knife的作用和在android studio的配置使用 在 butter knife 的 github上 第一句话就是: Field and method binding...

Android Butter Knife 框架——最好用的View注入

最近在看GitHub上的一些代码时,发现很多工程都用到了Butter Knife这个框架,能节省很多代码量。像findViewById这种代码就不用再出现了,而且这个框架也提供了很多其他有用的注解。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android--Butter Knife
举报原因:
原因补充:

(最多只允许输入30个字)