2018.9.12
1、ButterKnife——牛油刀
Field and method binding for Android Views which uses annotation processing to generate boilerplate code for you
功能:
(1)绑定字段
(2)可以绑定成组的组件或者数组
(3)绑定监听器
(4)绑定资源
2、如何获取ButterKnife?
(1)在Project的build.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()
}
}
(2)Module依赖设置的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、绑定监听器
ClickListener、SelectedItemListener……
将控件的事件与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
效果: