android注入之ButterKnife的使用

注入的话相信大家应该都是很熟悉的,他不仅把代码的结构简洁化,还能减少很大一部分的findviewByid的代码量 ,但是平时看到的注入都是封装在一个大的框架中的,比如xUtils,这里我们来介绍下一个独立的小框架 .jar包的下载地址 (这里说的是5.0的包)

1.配置Eclipse

在使用ButterKnife需要先配置一下Eclipse。

项目右键-Properties-Java Complier-Annotation Processing 确保设置和下图一致

接着展开Annotation Processing选择Factory Path,选中Enable project specific settings。然后点击 Add JARs…,选中ButterKnife的jar包

然后点击ok保存设置,Eclipse将问你是否重新构建新项目,点击Yes。

确保你项目的根目录里有一个.apt_generated的文件夹,文件夹中包含YOURACTIVITY$$ViewInjector.java这样的文件。

2 使用注解

2.1 在Activity中使用注解


1

2

3

4

5

6

7

8

9

10

11

12

class ExampleActivity extends Activity {

  @InjectView(R.id.title) TextView title;

  @InjectView(R.id.subtitle) TextView subtitle;

  @InjectView(R.id.footer) TextView footer;

  @Override public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.simple_activity);

    ButterKnife.inject(this);

    // TODO Use "injected" views...

  }

}

2.2 Fragment中使用注解


1

2

3

4

5

6

7

8

9

10

11

public class FancyFragment extends Fragment {

  @InjectView(R.id.button1) Button button1;

  @InjectView(R.id.button2) Button button2;

  @Override View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fancy_fragment, container, false);

    ButterKnife.inject(this, view);

    // TODO Use "injected" views...

    return view;

  }

}

2.3 Adapter中使用注解


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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

  }

  static class ViewHolder {

    @InjectView(R.id.title) TextView name;

    @InjectView(R.id.job_title) TextView jobTitle;

    public ViewHolder(View view) {

      ButterKnife.inject(this, view);

    }

  }

}

2.4事件注入

点击事件注入


1

2

3

4

@OnClick(R.id.submit)

public void sayHi(Button button) {

  button.setText("Hello!");

}

多个控件具有相同的事件


1

2

3

4

5

6

7

8

@OnClick({ R.id.door1, R.id.door2, R.id.door3 })

public void pickDoor(DoorView door) {

  if (door.hasPrizeBehind()) {

    Toast.makeText(this"You win!", LENGTH_SHORT).show();

  else {

    Toast.makeText(this"Try again", LENGTH_SHORT).show();

  }

}

2.5重置注入


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public class FancyFragment extends Fragment {

  @InjectView(R.id.button1) Button button1;

  @InjectView(R.id.button2) Button button2;

  @Override View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fancy_fragment, container, false);

    ButterKnife.inject(this, view);

    // TODO Use "injected" views...

    return view;

  }

  @Override void onDestroyView() {

    super.onDestroyView();

    ButterKnife.reset(this);

  }

}

2.6 可选注入

默认情况下@InjectView@OnClick注入是必选的,如果view未找到将出现异常。为了避免出现异常,添加一个@Optional注解。

2.7其它

ButterKnife还包含了两个findById方法。


1

2

3

4

View view = LayoutInflater.from(context).inflate(R.layout.thing, null);

TextView firstName = ButterKnife.findById(view, R.id.first_name);

TextView lastName = ButterKnife.findById(view, R.id.last_name);

ImageView photo = ButterKnife.findById(view, R.id.photo);

3 混淆

为避免混淆的时代码被移除,所以要在proguard-project.txt中添加如下代码避免混淆


1

2

3

-dontwarn butterknife.internal.**

-keep class **$$ViewInjector { *; }

-keepnames class * { @butterknife.InjectView *;}

扩展阅读

Butterknife

Butterknife中文

版本7.0.0中,现在注解已经不叫@InjectView了,而叫@Bind,感觉更贴合语义。同时注册的方式也从

ButterKnife.inject(this);

变成了

ButterKnife.bind(this);

关于7.0.0的ButterKnife的各种用法和功能,可以参考ButterKnife的github上的主页:

http://jakewharton.github.io/butterknife/

注,在windows下,某些eclipse版本无法选择 Compiler/Annotation Processing"。下面是两个版本的比较。

adt-bundle-windows-x86_64-20140702 (较新的版本,不可以)

adt-bundle-windows-x86_64-20131030 (2013年的版本,可以)

原因是谷歌在bundled版本中移除了Annotation Processing 选项,目的是为了锁定到他们自己新出的注解系统中: /extras/android/support/annotations/android-support-annotations.jar

github上的解决办法是安装如下图所示的东西:

当然换成android studio应该更好解决

可以让你在添加Butterkinfe注解时偷偷懒,直接点击几下鼠标既可以完成注解的增加,同时还是图形化的操作,可以说,大大的减轻了开发负担。尤其是当你的layout中有很多很多的view需要通过findviewbyid来获得引用时。实际上如果不用这个插件而通过手打加ButtefKnife注解的方式,要是view很多启示也挺麻烦的,不是吗?

首先看看如何在Android Studio上安装该插件,直接看图:

安装好后需要restart你的Android Studio。

在使用此插件前,需要已经导入了butterknife的jar(或者在build.gradle中已经加入:compile‘com.jakewharton:butterknife:7.0.0‘)

随后,在你需要导入注解的Activity或者Fragment或者ViewHolder的layout资源代码上,右击,选择 Generate 然后Generate ButterKnife Injections,这时候生成类似于下列的选择框:

Element为view的类型,ID为layout中资源的id名字,Variable Name即为你在代码中引用出来的变量名,点击Confirm后即可。

下面是Android ButterKnife Zelezny的github上的一个动态使用流程图:

时间: 2024-10-16 16:26:05

android注入之ButterKnife的使用的相关文章

Android注入框架butterknife

开源地址:https://github.com/JakeWharton/butterknife 参考: 1.http://www.jianshu.com/p/4f7338ef806e 2.http://blog.csdn.net/itjianghuxiaoxiong/article/details/50177549 ButterKnife 是在编译时注解,不会在运行时产生负担,Build工程后你会发现它生成了需要的代码,即它不是使用反射或者在运行时生成代码,所以它不会导致任何性能问题,也不会影响

Android 注入详解

Android下的注入的效果是类似于Windows下的dll注入,关于Windows下面的注入可以参考这篇文章Windows注入术.而Android一般处理器是arm架构,内核是基于linux,因此进程间是弱相互作用,不存在Windows下类似于CreateRemoteThread 作用的函数,可以在其他进程空间内创建线程来加载我们的.so文件,所以我们所采用的方法就是依赖于linux下的ptrace()函数,将目标进程作为我们进程的子进程操作目标进程的寄存器和内存来运行我们加载.so文件的代码

Android注入完全剖析

0 前沿 本文主要分析了一份实现Android注入的代码的技术细节,但是并不涉及ptrace相关的知识,所以读者如果不了解ptrace的话,最好先学习下ptrace原理再来阅读本文.首先,感谢源代码的作者ariesjzj大牛,没有他的源码就没有本文~.文中有不对的地方,望各位大牛斧正!谢谢~ 相关代码下载地址: http://pan.baidu.com/s/1o6ul8eA 或者去代码原作者的blog: http://blog.csdn.net/jinzhuojun/article/detail

关于Android依赖注入框架ButterKnife和Dagger的简单比较

最近调研了Android平台可以使用的依赖注入框架.发现现在常用的有四种.Dagger.Butter Knife.RoboGuice.Android Annotations.经过一系列的比较,最后我们的选择 的范围缩小到Dagger.Butter Knife这2个框架上.其实在国内外使用的比较多的应该是Dagger.但是我觉得还是有点复杂了,再看jakewharton的blog时,他也提到了dagger,我 摘抄了他在stackoverflow上回答Difference between Dagg

Android学习笔记- ButterKnife 8.0注解使用介绍

前言: App项目开发大部分时候还是以UI页面为主,这时我们需要调用大量的findViewById以及setOnClickListener等代码,控件的少的时候我们还能接受,控件多起来有时候就会有一种想砸键盘的冲动.所以这个时候我们想着可以借助注解的方式让我们从这种繁重的工作中脱离出来,也让代码变得更加简洁,便于维护,今天主要学习一下只专注View.Resource.Action注解框架ButterKnife. ButterKnife介绍 ButterKnife是一个专注于Android系统的V

Macbook下Android studio的butterknife的应用

android studio 版本1.2.1 1. 在build.gradle中增加加粗的语句,butterknife的版本为6.1.0 apply plugin: 'com.android.application' android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.example.wuqiong.demo" minSdkVersi

Android注入事件的三种方法比较

方法1:使用内部APIs 该方法和其他所有内部没有向外正式公布的APIs一样存在它自己的风险.原理是通过获得WindowManager的一个实例来访问injectKeyEvent/injectPointerEvent这两个事件注入方法. IBinder wmbinder = ServiceManager.getService( "window" ); IWindowManager m_WndManager = IWindowManager.Stub.asInterface( wmbin

Android注入框架你应该知道的一切------打造自己的注入框架

前言 Java的所有框架基本都是基于反射的,所以有句话是这么说的,无反射,无框架.所以Android的注入框架也是基于反射的,接下来就简单的介绍一下Android的注入框架你应该知道的一切. 注解简介 注解(Annotation)在Java里面是比较重要的一部分,但是通常很少接触到这一部分,这里就简单的过一下.现在我们简单的写一个注解然后解释它. 通过Eclipse右键->New->Annotation然后敲入下面的代码. @Target(ElementType.FIELD) @Retenti

Monkey源码分析番外篇之Android注入事件的三种方法比较

原文:http://www.pocketmagic.net/2012/04/injecting-events-programatically-on-android/#.VEoIoIuUcaV 往下分析monkey事件注入源码之前先了解下在android系统下事件注入的方式,翻译一篇国外文章如下. Method 1: Using internal APIs 方法1:使用内部APIs This approach has its risks, like it is always with intern