Java架构技术进阶

Android Studio实战之 ButterKnife 使用

2019-07-20  本文已影响11人  程就人生

butterknife作为Android App开发中的一款利器,在Android Studio开发时,不得不使用它来简化开发任务的繁重,相比Android annotations,在性能上具有一定的优化。接下来,直奔主题,看看一款新建的app应用是如何使用butterknife的。

环境

Android Studio 3.4.1
butterknife 10.0.0
java版本为1.8

第一步,新建立一个项目,也可以使用已有的项目,在这里为了方便演示,减少关联,新建了一个empty activity项目
第二步,进行butterknife插件的安装,

安装butterknife有两种方式,一种是通过file->structure->dependencies进行在线安装,另一种通过手动配置进行安装;这里采用手动配置;不管是哪种,最终还是要检查配置文件。
1)在项目的build.gradle的dependencies增加

classpath 'com.jakewharton:butterknife-gradle-plugin:10.1.0'

2)在app的build.gradle的头部增加

apply plugin: 'com.jakewharton.butterknife'

3)在app的build.gradle的dependencies增加

implementation 'com.jakewharton:butterknife:10.1.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'

4)在app的build.gradle的android属性下,增加jdk的版本,否则容易报各种莫名的错误

//指定jdk版本
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
第三步,检验butterKnife是否能正常使用,修改activity的代码如下:
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //使用butterKnife进行绑定,很重要,不然click等等绑定事件不起作用
        ButterKnife.bind(this);

    }

    @OnClick(R.id.button) void click(){
        Log.i("aaaaaaaaaa","BBBBBBBBBBbbb");
        Toast.makeText(this, "bbbbb", Toast.LENGTH_SHORT).show();
    }
}

注意事项:
绑定的事件,如果不起作用,就需要检查一下在onCreate方法里,是否使用ButterKnife进行绑定了,刚开始使用,容易遗漏。

在这次配置中,失败了好几次,也找了网上的很多资料,都没有解决配置中失败的问题,无论是手动配置,还是配置文件Sync Now。

使用9.1.0-rc1的版本时,本系统只支持9.1.0-rc2以上的版本;
使用9.1.0-rc2的版本时,需要支持AndroidX,打开配置一看,是支持的呀?
最后换了10.1.0的版本,又报错找不到等等,翻了很多资料,先把jdk的版本加一加吧,没想到,加了这个就好了,可以运行了。

使用butterknife的好处,就是可以不用在xml文件中进行事件绑定,还可以在activity中直接对有id属性的控件进行各种操作,以注解的方式来简化操作。另外butterknife不是基于反射机制的,在翻译的时候就把代码生成,所以不影响性能,这是butterknife的一个优点。

ButterKnife使用实例
一、绑定事件

@OnClick(R.id.fab)
public void show(View view){
        Snackbar.make(view, "Replace with your own action",Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
}

@OnItemSelected(R.id.list_view)
void onItemSelected(int position) {
  // TODO ...
}

@OnItemSelected(value = R.id.maybe_missing, callback = NOTHING_SELECTED)
void onNothingSelected() {
  // TODO ...
}

二、绑定视图

 @BindView(R.id.toolbar)
    Toolbar toolbar;
    @BindView(R.id.fab)
    FloatingActionButton fab;

三、在activity、fragment、Adapter初始化的时候进行绑定操作
activity的onCreate方法

 public class MainActivity extends AppCompatActivity {

    //绑定文本
    @BindView(R.id.title1) TextView title;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //使用butterKnife进行绑定,很重要,不然click等等绑定事件不起作用
        ButterKnife.bind(this);

        //设置标题
        title.setText("标题");
    }

Fragment的onCreateView方法

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

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

常用注解:
@BindViews
绑定多个view id 为一个view的list变量 @BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name }) List<EditText> nameViews;

@BindView
绑定一个view id为一个view变量@BindView(R.id.title) TextView title;

@BindArray
绑定String中的array数组 @BindArray(R.array.city)String[] citys;

@BindBitmap
绑定图片资源文件, @BindBitmap(R.mipmap.wifi) Bitmap bitmap;

@BindBool
绑定真假boolean @BindBool(R.bool.boor)

@BindColor
绑定颜色 @BindColor(R.color.red)

@BindDimen
绑定尺寸 @BindDimen(R.dimen.spacer) Float spacer;

@BindDrawable
绑定Drawable @BindDrawable(R.drawable.graphic) Drawable graphic

@BindFloat
绑定Float

@BindInt
绑定Int

@BindString
绑定一个String id为String变量, @BindString(R.string.app_name) String msg

@BindAnim
绑定动画

@BindFont
绑定字体文字

绑定事件,一共有12个事件监听

@OnClick
点击事件

@OnCheckedChanged
选中,选中取消

@OnEditorAction
软键盘的功能按键

@OnFocusChange
焦点改变

@OnItemClick
Item被点击事件(注意这里有坑,如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false)

@OnItemLongClick
tem长按,返回真则可以拦截onItemClick

@OnItemSelected
Item被选择事件

@OnLongClick
长按事件

@OnPageChange
页面改变事件

@OnTextChanged
EditText里面的文本变化事件

@OnTouch
触摸事件

@Optional
选择性注入,如果当前对象不存在,就会抛出一个异常,为了压制这个异常,可以在变量或者方法上加入一下注解,让注入变成选择性的,如果目标View存在,则注入, 不存在,则什么事情都不做。

参考文档:
http://jakewharton.github.io/butterknife/
https://blog.csdn.net/qq_29924041/article/details/80538360

微信扫一扫,关注一下
上一篇下一篇

猜你喜欢

热点阅读