ButterKnife:View注入框架

QuibblerQuibbler 2020-02-17 约 8 分钟 1835 次阅读

ButterKnife:View注入框架

1、ButterKnife介绍

ButterKnife是注解中相对简单易懂的很不错的开源框架.

1.1、ButterKnife优势

使用ButterKnife可以提升我们的开发效率,不需要写很多findViewById()方法来找到View对象。

  • Eliminate findViewById calls by using @BindView on fields.
  • Group multiple views in a list or array. Operate on all of them at once with actions, setters, or properties.
  • Eliminate anonymous inner-classes for listeners by annotating methods with @OnClick and others.
  • Eliminate resource lookups by using resource annotations on fields.

GitHub地址:https://github.com/JakeWharton/butterknife

1.2、准备ButterKnife

在项目的build.gradle添加ButterKnife的依赖

dependencies {
        implementation 'com.jakewharton:butterknife:10.2.1'
        annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'
        ...
    }

2、使用ButterKnife


2.1、ButterKnife初始化变量

以前初始化控件都是从布局文件通过findViewById()方法,将布局中控件与变量进行绑定。

mImageView = findViewById(R.id.image);

代码显得比较臃肿、重复。通过ButterKnife注解,大大减少这部分的编码量,同时代码逻辑清晰,不会降低APP效率。

@BindView(R.id.image)
    ImageView mImageView;

诸如strings.xml中的字符串等资源,也可通过ButterKnife注解初始化:

@BindString(R.string.app_name)
    String mAppName;

需要在onCreate()方法中,setContentView(int layoutResID)方法调用之后,进行ButterKnife绑定初始化:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.activity_base_glide);
        ButterKnife.bind(this);
    }

2.2、ButterKnife设置监听器

以前View的点击都需要设置诸如setOnClickListener(),监听点击事件。通过ButterKnife可以直接:

@OnClick(R.id.image)
    public void onViewClicked() {
      //点击事件  
    }

如果有多个控件需要点击处理呢?可以复用,通过switch判断不同的View点击事件。

@OnClick({R.id.image, R.id.text_view})
    public void onViewClicked(View view) {
    
        switch (view.getId()) {
            case R.id.image:
                break;
                
            case R.id.text_view:
                break;
        }
    }

2.3、注意

①成员变量定义成private或者static编译会报错。所以,还是默认的访问权限吧。

        @BindView fields must not be private or static.

②Butterknife插件用到了Lambda语法,需要指定Java 8及以上的JDK编译选项,参考AndroidStudio中使用Java8。否则报错:

        Process: com.example.myapplication, PID: 13034

        java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of 'java.lang.invoke.LambdaMetafactory' appears in /apex/com.android.runtime/javalib/core-oj.jar)

        at butterknife.internal.DebouncingOnClickListener.<clinit>(DebouncingOnClickListener.java:12)

3、ButterKnife插件

还有更加高效的方式,在AndroidStudio Plugins中搜索安装ButterKnife插件

在Activity代码中,鼠标放到setContentView(@LayoutRes int layoutResID)中的R.layout.xxx上,按Alt+Insert键,弹出菜单,选择Generate Butterknife Injections选项。

        会出现在布局文件中定义的控件,前提是这些控件都有id,才能被ButterKnife识别。


相关博客:

        Android中ButterKnife的使用

Stack Overflow > Error using Retrofit Builder in Android app: java.lang.NoSuchMethodError

相关推荐

Airbnb开源项目
精选开源

Airbnb开源项目

Airbnb Engineering & Data ScienceAirflow Use Apache Airflow (incubating) to author workflows as directed acyclic graphs (DAGs) of tasks12,263Airpal Web UI for PrestoDB2,502Aerosolve A machine learning

2.3k
WilliamChart:轻量美观的 Android 图表库实战
精选开源

WilliamChart:轻量美观的 Android 图表库实战

WilliamChart:轻量美观的 Android 图表库实战数据可视化是运动、健康、金融、统计类 App 的刚需。MPAndroidChart 功能最全但偏重复杂,WilliamChart 走的则是"轻量 + 美观 + Kotlin 原生"路线——v3 用 Kotlin 完全重写,API 极简,一行 chart.animate(dataSet) 就能把数据画成带动画的折线/柱状/环形图,开箱即

175
sherpa解析:开源语音技术全家桶
精选开源

sherpa解析:开源语音技术全家桶

想在手机、树莓派甚至 RISC-V 开发板上离线跑语音识别,五年前还是个需要啃 Kaldi 源码的硬核课题。k2-fsa 组织的 sherpa 把这件事变成了"下载预训练模型、装个包、跑示例"的三步操作。这个以 Apache-2.0 协议开源的项目自我定位是"新一代 Kaldi 的语音转文本框架",它专注端到端模型的推理部署:transducer 与 CTC 两类架构,C++ 与 Python 双…

44