butterknife android最多可以找到多少个控件

首次使用ButterKnife之经历谈 - 简书
首次使用ButterKnife之经历谈
ButterKnife是一个专注于Android系统的View注入框架,能够简化代码,再也不用写大量的findViewById以及setOnClickListener代码,这东东真心不错哦,很方便,啧啧啧。
原本以为,用AndroidStudio使用ButterKnife只要在项目中的Module:app的gradle文件中加入compile'com.jakewharton:butterknife:8.2.1' 就OK了,结果在按照文档的方式来给控件设置点击事件,一直无效获取不到控件的点击事件,于是在初始化的时候又尝试给控件手动设置一个点击事件,啊噢!突然报空指针错误了,检查代码,ButterKnife.bind(this)这句话,确实是写在setContentView()方法后面呀,无奈各种查找资料呀,貌似是因为ButterKnife更新了,最新的引入方式变了喽,反正我按照github上的方式来把ButterKnife加入项目,就成功解决了问题。
今天,来更新下此篇文章,因为最近再次在项目中引入ButterKnife,发现又出了点小小问题,它又更新啦,so,我也要更新下使用过程。
先附上ButterKnife地址:
项目网页版example地址:GitHub地址:
一. 配置project的build.gradle,添加plugin:
buildscript { repositories {
mavenCentral() }dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0' }}二. 配置module的build.gradle:
apply plugin: 'com.android.library'apply plugin: 'com.jakewharton.butterknife'
...}dependencies {
compile 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'}看来还是得到GitHub上面查看怎么配置才行呢,反正我的项目中Module:app的build.gradle是这样的:
截图取自项目
Project的build.gradle:
截图取自项目
再编译,发现出错啦,报错为 Could not find method annotationProcessor() for arguments
截图取自项目
找资料,解决方法:把Android Studio更新到 2.2.0+版本,更新dependencies中的gralde也为2.2.0+就OK啦~
截图取自项目
好啦,一切都正常了,反正也就是配置的时候出错了,然后就是使用了,首先就要在setContentView()方法执行了之后,ButterKnife.bind(this);然后用控件就在定义每个控件上面写@BindView(R.id.xx)就声明了控件啦,于是就直接使用啦,真的很方便,详细介绍官网都有,看看就会了,我这里直接写的一个BaseActivity去使用ButterKnife.bind(this)让其他Activity去继承它,就不用写很多次重复的代码啦,啧啧啧。
public abstract class BaseActivity extends AppCompatActivity {
protected void onCreate(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(getLayoutId());
ButterKnife.bind(this);
protected abstract int getLayoutId();}其他Activity使用依赖注入的局部代码
Paste_Image.png
点击事件:
Paste_Image.png
O啦~至于其他Fragment啊使用都类似,看看官方介绍就知道怎么用啦,这就是我使用它的经历啦,关键还是配置,如果没引入成功,点击事情没反应啊什么的,估计都是配置问题了,看看最新的GitHub上面怎么写的就行了,网上很多都很久了,比如就是绑定view的语法现在都换了,还是要以最新的为准呢,也不能光看网上百度的教程。
加一句话,ButterKnife是个预编译技术。
嗯哼~么么哒~如果布局中的控件比较多,然后需要重复findViewById,很麻烦,今天看到一个简单的方法,分享一下,看看效果图(我的图过大,所以暂时借一个博客上的图)
步骤:去github上
在android studio中的app build.gradle加入
compile ‘com.jakewharton:butterknife:7.0.1’
点击File–&Settings–&Plugins,搜索butterknife zelezny,安装,重启android Studio
在你需要导入注解的Activity或者Fragment或者ViewHolder的layout资源代码上,右击,选择 Generate 然后 Generate ButterKnife Injections
注意:需要将光标移到setContentView(R.layout.XXX)
当然,也可以给控件加上点击事件
@Bind(R.id.id_button1)
Button idButton1
@Bind(R.id.id_button2)
Button idButton2
@Bind(R.id.id_button3)
Button idButton3
@OnClick({R.id.id_button1,R.id.id_button2,R.id.id_button3})
void testButtonClick() {
Toast.makeText(MainActivity.this, "测试点击", Toast.LENGTH_LONG).show()
混淆代码如下
-keep class butterknife.* { ; }
-dontwarn butterknife.internal.**
-keep class *$$ViewBinder { ; }
-keepclasseswithmembernames class * {
@butterknife.* ;
-keepclasseswithmembernames class * {
@butterknife.* ;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:41640次
积分:1075
积分:1075
排名:千里之外
原创:71篇
评论:18条
(5)(2)(5)(3)(6)(1)(5)(1)(14)(9)(9)(11)ButterKnife基本使用
Butter Knife处理字段和方法绑定.
重要更新: 目前(), ButterKnife的最新版本是8.0.1.
Demo项目已更新:&
以下原文是针对ButterKnife v6.1.0的, v8.0.1主要的不同在以下几个关键词:
@InjectView -& @BindView
@InjectViews -& @BindViews
ButterKnife.inject(this) -& ButterKnife.bind(this)
ButterKnife.reset(this) -&
unbinder = ButterKnife.bind(this, view);
public void onDestroyView() {
unbinder.unbind();
super.onDestroyView();
用gradle配置的时候加入:
compile 'com.jakewharton:butterknife:6.1.0'
注意是加在Module: app的gradle文件中.
加上之后不用运行什么命令,直接Sync一下就可以在External Libraries里面看到butterknife.
功能1: 再也不用写findViewById()啦.
mTextView1 = (TextView) findViewById(R.id.butter_text_view_1);
现在可以这样实现:
首先在变量声明的时候加上注解:
@InjectView(R.id.butter_text_view_2)
TextView mTextView2;
如果id找不到,会在编译的时候报错.
之后在设置好布局之后调用ButterKnife.inject():
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.demo_butter_knife);
//using butter knife
ButterKnife.inject(this);
之后View对象就可以直接使用了.
需要注意的是View变量声明的时候不能为private或者static.
除了Activity之外,你可以提供其他的View Root,来获取对象(执行注入).
还可以用来简化Adapter里面的ViewHolder:
ButterKnife in Fragment
在Fragment中也可以使用ButterKnife来获取View:
public class SimpleFragment extends Fragment {
@InjectView(R.id.fragment_text_view)
TextView mTextV
public SimpleFragment() {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_simple, container, false);
ButterKnife.inject(this, view);
mTextView.setText("TextView in Fragment are found!");
ButterKnife in Adapter ViewHolder
Adapter有一种常用的优化策略,就是使用ViewHolder来减少findViewById()的重复调用.
以前写过相关的博文:&
用了ButterKnife之后, ViewHolder的使用可以变成这样:
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.person_item_layout, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
holder = (ViewHolder) convertView.getTag();
Person person = getItem(position);
if (null != person) {
holder.name.setText(person.getName());
holder.age.setText(String.valueOf(person.getAge()));
holder.location.setText(person.getLocation());
holder.work.setText(person.getWork());
return convertV
static class ViewHolder {
@InjectView(R.id.person_name)
@InjectView(R.id.person_age)
@InjectView(R.id.person_location)
@InjectView(R.id.person_work)
public ViewHolder(View view) {
ButterKnife.inject(this, view);
可以看到ViewHolder类加了一个带参数View的构造方法,用注解标记每个字段,再也不需要在getView()方法里调用findViewById()方法了.
功能2: 再也不用写setOnClickListener()啦.
比如之前的:
finishButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
现在可以写成:
@OnClick(R.id.basic_finish_a_button)
void finishA(View view) {
注意这里方法仍然不能是private和static, 并且可以有一个参数View,也可不写.
所有listener的参数都是optional的,可以写,也可以不写.
并且写的时候可以直接写一个具体的子类,比如参数View可以写成Button,这里的cast是自动完成的.
注意还是需要调用一下ButterKnife.inject(this);
否则事件绑定不成功.
忘记调用ButterKnife.inject(this);对于findView来说会报错,但是对于绑定事件来说不会报错,只是没有事情发生.
除了点击事件@OnClick,还有ListView的点击@OnItemClick, CheckBox的@OnCheckedChanged等等.
可以一次指定多个id,为多个View绑定一个事件处理方法,比如:
//you can bind listener to multiple views
@OnClick({R.id.button_enable, R.id.button_disable, R.id.button_alpha_0, R.id.button_alpha_1})
void editViewsClicked() {
Toast.makeText(this, "You click the Button!", Toast.LENGTH_SHORT).show();
功能3: 组建View List: 把多个View放在一起用
可以同时获取多个View,放在一个List中:
@InjectViews({R.id.label_first_name, R.id.label_middle_name, R.id.label_last_name})
List&TextView& labelV
@InjectViews({R.id.first_name, R.id.middle_name, R.id.last_name})
List&EditText& nameV&
注意id用逗号分隔,大括号包围,外面才是小括号.
apply()方法允许你为一组对象批量地设置值.
apply()方法共有3种形式:
public static &T extends View& void apply(List&T& list, Action&? super T& action)
public static &T extends View, V& void apply(List&T& list, Setter&? super T, V& setter, V value)
public static &T extends View, V& void apply(List&T& list, Property&? super T, V& setter, V value)
即Action, Setter和Property三种.
其中Action和Setter都是ButterKnife的类,需要继承,写自己的子类实现,然后传入对象.
Setter的第三个参数可以指定要set到什么值.
Property是Android中的类:
具体的使用可以参见例子:
其他实用方法
1.注入重置(Injection Rest):
可以用reset()方法将ButterKnife注入的View引用设置为null.
比如在Fragment的onCreateView()里调用ButterKnife.inject()方法注入了一些View,在onDestroyView()里想把它们置为null,可以直接调用ButterKnife.reset(this);方法.
2.选择性注入(Optional Injection):&
默认情况下,@InjectView和listener的注入都是必须的,如果target view没有被发现,则会报错.
为了抑制这种行为,可以用@Optional注解来标记field和方法,让注入变成选择性的,如果targetView存在,则注入, 不存在,则什么事情都不做.
当布局被复用时,这个@Optional注解很有用.
3.多方法的listener(Multi-method Listeners):
有一些View的listener是有多个回调方法的,比如Spinner的onItemSelectedListener:
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView&?& parent, View view, int position, long id) {
public void onNothingSelected(AdapterView&?& parent) {
方法注解可以用来绑定到这些方法中的任何一个.
每一个注解有一个默认的callback,指定它绑定到什么方法上;可以通过callback参数指定为一个特定的方法.
没有指定callback,默认对应onItemSelected()方法:
@OnItemSelected(R.id.my_spinner)
//default callback : ITEM_SELECTED
void onItemSelected(int position) {
Toast.makeText(this, "position: " + position, Toast.LENGTH_SHORT).show();
指定了callback,对应onNothingSelected()方法:
@OnItemSelected(value = R.id.my_spinner, callback = OnItemSelected.Callback.NOTHING_SELECTED)
void onNothingSelected() {
Toast.makeText(this, "Nothing", Toast.LENGTH_SHORT).show();
注意的是Spinner中只要有数据,默认都会选中第0个数据,所以想进入到onNothingSelected()方法,就需要把Adapter中的数据都清空.
具体完整例子见:
4.findById()方法
ButterKnife.findById()可以用来获取Activity,Dialog或View中的任何View.
ButterKnife自动完成了类型转换,所以获取出来以后不用进行显式强转,直接赋值给具体的View类型引用即可.
Resources:
Sample Project:
Introduction:&
Java Doc:&
阅读(...) 评论()3706人阅读
android 基础(127)
package com.example.
import android.annotation.SuppressL
import android.app.A
import android.graphics.drawable.D
import android.os.B
import android.widget.TextV
import android.widget.T
import butterknife.B
import butterknife.BindC
import butterknife.BindD
import butterknife.BindD
import butterknife.BindS
import butterknife.ButterK
import butterknife.OnC
public class MainActivity extends Activity {
@Bind(R.id.tv_text1)
TextView tv_text1;
@Bind(R.id.tv_text2)
TextView tv_text2;
@Bind(R.id.tv_text3)
TextView tv_text3;
@Bind(R.id.tv_text4)
TextView tv_text4;
@SuppressLint(&NewApi&)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(MainActivity.this);
tv_text1.setText(&1231&);
tv_text2.setText(&1024&);
tv_text3.setText(&5454&);
tv_text4.setText(&7865&);
// @OnClick(R.id.tv_text1)
// public void sayHi(TextView button) {
// button.setText(&你按到我了啦!&);
// @SuppressLint(&NewApi&)
// @OnClick(R.id.tv_text2)
// public void sayHi2(TextView button) {
// button.setBackground(graphic);
// @OnClick(R.id.tv_text3)
// public void sayHi3(TextView button) {
// button.setTextColor(red);
// @OnClick(R.id.tv_text4)
// public void sayHi4(TextView button) {
// button.setTextSize(spacers);
@OnClick({ R.id.tv_text1, R.id.tv_text2, R.id.tv_text3, R.id.tv_text4 })
public void sayHi(TextView button) {
switch (button.getId()) {
case R.id.tv_text1:
button.setText(&你按到我了啦1!&);
Toast.makeText(this, &你按到我了啦1!&, Toast.LENGTH_SHORT).show();
case R.id.tv_text2:
button.setText(&你按到我了啦2!&);
Toast.makeText(this, &你按到我了啦2!&, Toast.LENGTH_SHORT).show();
case R.id.tv_text3:
button.setText(&你按到我了啦3!&);
Toast.makeText(this, &你按到我了啦3!&, Toast.LENGTH_SHORT).show();
case R.id.tv_text4:
button.setText(&你按到我了啦4!&);
Toast.makeText(this, &你按到我了啦4!&, Toast.LENGTH_SHORT).show();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:151803次
积分:3679
积分:3679
排名:第7392名
原创:126篇
转载:241篇
译文:45篇
(2)(9)(18)(8)(5)(11)(63)(75)(3)(13)(11)(20)(9)(15)(17)(28)(11)(3)(10)(17)(18)(50)(1)(1)(1)(2)(1)Android进阶(16)
1、ButterKnife简介
butterknife是出自Android大神JakeWharton之手的一个开源库,它通过注解的方式来替代android中view的相关操作。专注于Android系统的View,可以减少大量的findViewById以及setOnClickListener代码,可视化一键生成。这个开源库可以让我们从大量的findViewById()和setonclicktListener()解放出来,其对性能的影响微乎其微(查看过Butter Knife的源码,其自定义注解的实现都是限定为RetentionPolicy.CLASS,也就是到编译出.class文件为止有效,在运行时不额外消耗性能,其是通过java注解自动生成java代码的形式来完成工作)。
项目地址:
2、ButterKnife优势
通过BindXXX等方式来替代View的常见操作,简化代码,提升开发效率。通过注解的方式实现,但是运行时不会影响App的效率。代码清晰,可读性强。
二、如何引用ButterKnife?
在Module对应的gradle配置中,添加如下:
buildscript{
repositories{
mavenCentral()
dependencies{
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
apply plugin: 'com.neenbedankt.android-apt'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.jakewharton:butterknife:8.4.0'
apt 'com.jakewharton:butterknife-compiler:8.4.0'
三、ButterKnife常见使用
控件id 注解: @BindView(int id)
public class MainActivity extends AppCompatActivity {
@BindView(R.id.recyclerView)
public RecyclerView recyclerV
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
多个控件id 注解: @BindViews(id1,id2)
public class BindViewActivity extends AppCompatActivity {
@BindViews({R.id.title_name, R.id.describtion})
public List&TextView& textV
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bind_view);
ButterKnife.bind(this);
字符串id 注解:@BindString(id),绑定String字符串
public class BindViewActivity extends AppCompatActivity {
@BindViews({R.id.title_name, R.id.describtion})
public List&TextView& textV
@BindView(R.id.btn_number)
Button btn_
@BindString(R.string.title_name)
@BindString(R.string.describtion_name)
@BindString(R.string.button_text)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bind_view);
ButterKnife.bind(this);
textViews.get(0).setText(title);
textViews.get(1).setText(describtion);
btn_number.setText(button);
字符串数组id注解:@BindArray(id)
public class BindArrayString extends AppCompatActivity {
@BindArray(R.array.city)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
Bitmap图像id 注解: @BindBitmap(id)
public class BindArrayString extends AppCompatActivity {
@BindBitmap(R.mipmap.ic_launcher)
public Bitmap launcher_
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
颜色值id 注解:@BindColor(id)
public class BindArrayString extends AppCompatActivity {
@BindColor(R.color.colorAccent)
int colorA
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
布尔类型值id 注解:@BindBool(id)
public class BindArrayString extends AppCompatActivity {
@BindBool(R.bool.check)
boolean isC
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
三、ButterKnife快捷插件
: Butterknife插件的使用
这是一款在Android Studio中使用的插件,用于快速生成ButterKnife的使用。可参照下图示例:
两个晚上终于把总结写好了,春节就这么点成就吧!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:103478次
积分:3968
积分:3968
排名:第6612名
原创:85篇
评论:204条
作为技术人员,不仅要关注技术,同样需要对国家的政策进行关注,这样才能在这个社会中更好的生存。欢迎关注我的公众号【晨间短评】,利用零碎时间,掌握时事新闻。
阅读:3751
阅读:5749
(1)(1)(3)(1)(2)(1)(2)(6)(1)(5)(6)(8)(4)(5)(11)(1)(15)(16)(4)

我要回帖

更多关于 butterknife 的文章

 

随机推荐