View注入框架 下载地址

1.Activity Binging

通过@Bind凝视字段,Butter Knife能够通过View的ID自己主动找到并把对应的视图布局。
class ExampleActivity extends Activity {
  @Bind(R.id.title) TextView title;
  @Bind(R.id.subtitle) TextView subtitle;
  @Bind(R.id.footer) TextView footer;
 
  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);
    // TODO Use fields...
  }
}

替换了缓慢的反射,通过自己主动生成代码来运行查询。你能够看到或者Debug调用@Bind的对象来生成代码。下图为上图所生成的代码。

public void bind(ExampleActivity activity) {
  activity.subtitle = (android.widget.TextView) activity.findViewById(2130968578);
  activity.footer = (android.widget.TextView) activity.findViewById(2130968579);
  activity.title = (android.widget.TextView) activity.findViewById(2130968577);
}

2.Non Activity Binging

你能够指定Root View,从它中找到你@Bind的View
public class FancyFragment extends Fragment {
  @Bind(R.id.button1) Button button1;
  @Bind(R.id.button2) Button button2;
 
  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    ButterKnife.bind(this, view);
    // TODO Use fields...
    return view;
  }
}

3.Use in Adapter

在适配器列表中简化ViewHolder
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 view;
  }
 
  static class ViewHolder {
    @Bind(R.id.title) TextView name;
    @Bind(R.id.job_title) TextView jobTitle;
 
    public ViewHolder(View view) {
      ButterKnife.bind(this, view);
    }
  }
}

4.View List

你能够将多个View分组存储到List或者Array中

@Bind({ R.id.first_name, R.id.middle_name, R.id.last_name })
List<EditText> nameViews;
The apply method allows you to act on all the views in a list at once.
 
ButterKnife.apply(nameViews, DISABLE);
ButterKnife.apply(nameViews, ENABLED, false);
Action and Setter interfaces allow specifying simple behavior.
 
static final ButterKnife.Action<View> DISABLE = new ButterKnife.Action<View>() {
  @Override public void apply(View view, int index) {
    view.setEnabled(false);
  }
};
static final ButterKnife.Setter<View, Boolean> ENABLED = new ButterKnife.Setter<View, Boolean>() {
  @Override public void set(View view, Boolean value, int index) {
    view.setEnabled(value);
  }
};

一个Android属性相同能够使用apply 方法

ButterKnife.apply(nameViews, View.ALPHA, 0.0f);

5.Listener Binging

Listeners也能够自己主动配置方法

@OnClick(R.id.submit)
public void submit(View view) {
  // TODO submit data to server...
}
全部的Listener的參数是可选的
@OnClick(R.id.submit)
public void submit() {
  // TODO submit data to server...
}
定义一个特定的类型它能够自己主动的转换
@OnClick(R.id.submit)
public void sayHi(Button button) {
  button.setText("Hello!");
}
在同一个绑定事件处理中能够指定多个ID
@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();
  }
}

自己定义视图能够绑定自己的事件监听而且不指定ID

public class FancyButton extends Button {
  @OnClick
  public void onClick() {
    // TODO do something!
  }
}

6.Binging Reset

Fragments 比Activity有不同的View生命周期,在Fragmrnt 的onCreateView方法中绑定,onDestroyView方法中销毁Views。Butter
Knife有unbind 方法自己主动去做。

public class FancyFragment extends Fragment {
  @Bind(R.id.button1) Button button1;
  @Bind(R.id.button2) Button button2;
 
  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    ButterKnife.bind(this, view);
    // TODO Use fields...
    return view;
  }
 
  @Override public void onDestroyView() {
    super.onDestroyView();
    ButterKnife.unbind(this);
  }
}

7.Optional Binging

默认情况下,@Bind和侦听器绑定都是必需的。假设目标View无法找到它将抛出一个异常。

为了抑制这样的习惯常见了可选绑定。@Nullable注解加入到字段或者方法中
笔记:怎样注解前都支持@Nullable注解(官方鼓舞这种行为)
@Nullable @Bind(R.id.might_not_be_there) TextView mightNotBeThere;
 
@Nullable @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() {
  // TODO ...
}

8.Multi-Method Listeners

方法凝视对应的监听器有多个回调能够绑定到不论什么当中之中的一个。每个凝视都绑定到一个默认的回调。使用callback 參数指定一个替代

@OnItemSelected(R.id.list_view)
void onItemSelected(int position) {
  // TODO ...
}
@OnItemSelected(value = R.id.maybe_missing, callback = NOTHING_SELECTED)
void onNothingSelected() {
  // TODO ...
}

9.Bonus

还包括findById方法的简化依旧须要知道Views在哪个view、Activity、Dialog。

它使用泛型来判断返回类型,并自己主动运行。

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

注意:
使用Android Studio 须要在Gradle文件里加入
compile 'com.jakewharton:butterknife:(insert latest version)'

混淆编译的时候须要在proguard文件里加入
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * {
@butterknife.* <fields>;
} -keepclasseswithmembernames class * {
@butterknife.* <methods>;
}

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

View注入框架:Butterknife简单使用的更多相关文章

  1. [Android] Android 注解绑定UI View组件库 ButterKnife 的使用

    ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤.是大神JakeW ...

  2. ButterKnife--View注入框架的使用

    作为一名Android开发,是不是经常厌烦了大量的findViewById以及setOnClickListener代码,而ButterKnife是一个专注于Android系统的View注入框架,让你从 ...

  3. ButterKnife--View注入框架

    俗话说,不会偷懒的程序员不是好程序员!作为一名Android的开发者,我们已经厌烦了经常写大量的findViewById以及setOnClickListener代码.而ButterKnife是一个专注 ...

  4. ButterKnife View 注入

    /***************************************************************************************** * ButterK ...

  5. 玩转ButterKnife注入框架

    在去年这个时候,我写过一篇介绍Android注解的文章android注解使用详解,这篇文章主要是介绍了Android中的AndroidAnnotations注入框架,AA框架有它自身的一些优点,这里不 ...

  6. 【十一年】注入框架RoboGuice采用:(Your First Injection into a Custom View class)

    上一篇我们简单的介绍了一下RoboGuice的使用([十]注入框架RoboGuice使用:(Your First Testcase)),今天我们来看下自己定义View的注入(Custom View). ...

  7. 【二】注入框架RoboGuice使用:(Your First View Injection)

    上一篇我们简单的介绍了一下RoboGuice的使用([一]注入框架RoboGuice使用:(A brief example of what RoboGuice does)),今天我们我看下View的注 ...

  8. 简单谈谈Hilt——依赖注入框架

    今天继续Jetpack专题,相信不少的朋友都使用过Dagger,也放弃过Dagger,因为实在太难用了.所以官方也是为了让我们更好使用依赖注入框架,为我们封装了一个新的框架--Hilt,今天一起来看看 ...

  9. Butter Knife:一个安卓视图注入框架

    Butter Knife:一个安卓视图注入框架 2014年5月8日 星期四 14:52 官网: http://jakewharton.github.io/butterknife/ GitHub地址: ...

随机推荐

  1. WebService 布置简单的计算器

    实验环境:myeclipse2015 具体的过程如下: 首先建立一个web service project 命名就为WebServiceProject,同时选择web service framewor ...

  2. CodeForces 362E Petya and Pipes

    Petya and Pipes Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForces. ...

  3. Sublime 插件Pylinter could not automatically determined the path to lint.py

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50618630 安装Sublime Te ...

  4. WinServer-IIS-FTP服务器

    在设置FTP服务器的时候,注意SSL的设置,简单尝试的话,不需要启用SSL 常用FTP命令 ftp   进入FTP命令模式 open 192.168.10.6     (连接到FTP主机,或者open ...

  5. STL_算法_对全部元素排序(sort、stable_sort)

    C++ Primer 学习中. . .   简单记录下我的学习过程 (代码为主) //大部分容器适用.不适用于list容器 sort(b,e) sort(b,e,p) stable_sort(b,e) ...

  6. 【POJ 2485】 Highways

    [POJ 2485] Highways 最小生成树模板 Prim #include using namespace std; int mp[501][501]; int dis[501]; bool ...

  7. 通过Nginx訪问FastDFS文件系统并进行图片文件裁剪的性能測试和分析

    前段时间公司的分布式图片文件系统(FastDFS)做了图片裁剪和缩放功能,并把缩放计算和FastDFS做了解耦分离,前端用虚拟机作为图片文件缩放的訪问代理层(Nginx Proxy),后端使用ngin ...

  8. ArcGIS Server 10.2 公布Oracle11g数据源的 Feature Service

    安装好arcgis server 10.2及 Desktop 而且确保 arcgis server manager 能够正常启动执行载入服务 1.Oracle 配置 安装好Oracleserver端程 ...

  9. ES 遇到 unassigned shard如何处理?

    解决方法:(1)如果是红色的,可以直接分片shard给你认为有最新(或最多)数据的节点.见下: 摘自:https://discuss.elastic.co/t/how-to-resolve-the-u ...

  10. [TJOI2017] DNA 解题报告 (hash+二分)

    题目链接:https://www.luogu.org/problemnew/show/P3763 题目大意: 给定原串S0,询问S0有多少个子串和给定串S相差不到3个字母 题解: 我们枚举S0的子串, ...