ButterKnife1(2018年9月12日-2018年9月14日)

2018.9.12

1ButterKnife——牛油刀

Field and method binding for Android Views which uses annotation processing to generate boilerplate code for you

功能:

1)绑定字段

2)可以绑定成组的组件或者数组

3)绑定监听器

4)绑定资源

2、如何获取ButterKnife

1)在Projectbuild.gradle中设置buildScripts,插件依赖。

buildscript {

    repositories {

        google()

        maven {

            name "aliyunmaven"

            url "http://maven.aliyun.com/nexus/content/groups/public/"

        }        jcenter()

    }

    dependencies {

        classpath 'com.android.tools.build:gradle:3.1.0'

    }

}

 

 

allprojects {

    repositories {

        google()

        maven {

            name "aliyunmaven"

            url "http://maven.aliyun.com/nexus/content/groups/public/"

        }

        jcenter()

    }

}

2Module依赖设置的build.gradle中设置:

implementation 'com.jakewharton:butterknife:8.8.1'

annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

3)使用ButterKnife.bind(this),表示当前activity开启绑定。

4)注册字段,并绑定。

Project---build.gradle:

 

 

 

Module----build.gradle:

 

 

 

Layout:

 

 

 

MainActivity.java

 

 

 

效果:

 

 

 

 

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

改为implementation 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'

 

 

2018.9.13

1、ButterKnife如何实现绑定?

不是使用反射,而是使用代码生成,生成了bind的delegate方法,在oncreate中调用了bind,其实就是执行了findViewById().

性能没有下降。

【案例】查看ButterKnife自动生成的代码

 

 

 

 

2、资源绑定

Android中的资源:

图片、字符串、数组

使用的注解有:

@BindBool,绑定一个逻辑值

@BindColor, 绑定一个颜色

@BindDimen, 绑定一个尺寸

@BindDrawable, 绑定一个图片

@BindInt,绑定一个整数

@BindString,绑定一个字符串

【案例】如何绑定一个图片资源到Imageview上

项目结构:

 

 

 

string.xml

 

 

 

activity_main.xml

 

 

 

MainActivity.java

 

 

 

效果:

 

 

 

 

3、非Activity绑定

在Fragment中实现绑定。

【案例】在一个activity中加载了一个Fragment,fragment中有控件需要绑定,如何实现?

(1)定义Fragment的layout

(2)定义Fragment类 继承V4.fragment

(3)在Fragment中的onCreatView方法中实现ButterKnife的绑定

(4)在Activity对应的布局中引用Fragment,需要指定id。

项目结构:

 

 

 

fragment_fancy.xml

 

 

 

FancyFragment.java

 

 

 

activity_main.xml

 

 

 

MainActivity.java

 

 

 

 

效果:

 

RecyclerView中实现控件id绑定。

ViewHolder中实现绑定。

【案例】

 

 

 

build.gradle:

dependencies {

    implementation fileTree(include: ['*.jar'], dir: 'libs')

    implementation 'com.android.support:appcompat-v7:27.1.1'

    implementation 'com.android.support.constraint:constraint-layout:1.1.0'

    implementation 'com.jakewharton:butterknife:8.8.1'

    implementation 'com.android.support:support-v4:27.1.1'

    implementation 'com.android.support:design:27.1.1'

    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

    testImplementation 'junit:junit:4.12'

    androidTestImplementation 'com.android.support.test:runner:1.0.2'

    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    implementation 'com.android.support:recyclerview-v7:27.1.1'

}

item.xml

 

 

 

Person.java

 

 

 

MyHolder.java

 

 

 

MyAdapter.java

 

 

 

 

 

 

activity_main2.xml

 

 

 

Main2Activity.java

 

 

 

效果:

 

4、绑定一组view

例如,多个TextView一起绑定到一个List集合中。

使用的注解是@bindViews({x,y,z})--->List<view>

activity_main.xml

 

 

 

MainActivity.java

 

 

 

效果:

 

 

2018.9.14

1、绑定监听器

ClickListenerSelectedItemListener……

将控件的事件与view绑定。

【案例】为2个按钮来绑定click事件。

 

 

piu注意:

1)支持任意参数(可以有,也可以没有,如果有的话,按照listener写法)

2)参数类型可以从View类型转换成目标类型

【案例】实现参数类型转换和多Ids绑定

 

 

 

3)支持自定义控件的事件绑定

【案例】实现自定义控件的事件绑定

 

 

 

activity_main.xml:

 

 

 

 

 

 

 

 

MainActivity.java不变。

效果:

 

 

2、绑定重置

目的,让程序性能更好,不用时释放绑定。

【案例】在Fragment中实现绑定重置

项目结构:

 

 

 

fragment_red.xml

 

 

 

fragment_blue.xml

 

 

 

RedFragment.java

 

 

 

 

 

 

 

BlueFragment.java

 

 

 

activity_main2.xml

 

 

 

 

 

 

Main2Activity.java

 

 

 

效果:

 

 

3、可选的绑定

允许资源不存在,允许找不到指定的id控件。

在控件field上,使用@nullable

在控件method上,使用@optional

 

 

 

4、针对多方法的监听器如何绑定?

一个监听器中含有多个方法,只需绑定一个监听器,一个监听器在绑定时只能设置一个方法,如果一个监听器含有2个方法,另一个方法如何绑定?

使用:

@OnItemSelected(value = R.id.maybe_missing, callback = NOTHING_SELECTED)

void onNothingSelected() {

  // TODO ...

}

另一个方法,使用callback来指定,注意,按单词来分割编写,用_”来连接。

【案例】修改RecyclerView案例,实现点击响应。

修改MyAdapter.java

 

 

 

 

 

 

效果:

 

 

 

 

【思考】如果点击每一项,显示该项内容,如何实现?

 

 

 

4、通过ButterKnife创建针对集合控件操作的动作Act

作用,这个动作对所有控件都生效。

步骤:

1)定义动作

2)执行动作

【案例】定义一个动作,并执行。

activity_main3.xml

 

4、通过ButterKnife创建针对集合控件操作的动作Act

作用,这个动作对所有控件都生效。

步骤:

1)定义动作

2)执行动作

【案例】定义一个动作,并执行。

activity_main3.xml

 

4、通过ButterKnife创建针对集合控件操作的动作Act

作用,这个动作对所有控件都生效。

步骤:

1)定义动作

2)执行动作

【案例】定义一个动作,并执行。

activity_main3.xml

 

 

 

Main3Activity.java

 

效果:

 

 

Main3Activity.java

 

 

 

效果:

 

 

posted @ 2021-03-25 14:11  三生石头花  阅读(40)  评论(0编辑  收藏  举报