android - Butterknife View 注入(inject)

标签 android dependency-injection butterknife

我偶然发现了一个非常有趣的依赖注入(inject)库,名为 ButterKnife。使用 ButterKnife 可以轻松地将 View 注入(inject)到 Activity 或 fragment 中。

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...
  }
}

但是,如果使用依赖注入(inject),这些 View 必须是 public 以便 Butterknife 可以注入(inject)它(使用 private 字段会导致异常 字段不能是私有(private)的或静态的)。

在我过去的项目中,我总是将所有成员字段(包括 View )设为 private,因为我认为这是最佳实践(信息隐藏等)。现在我想知道是否有原因不应该将所有 View 都设为 public 吗?在这种情况下,我不能使用 ButterKnife 但我想使用它,因为它大大简化了代码。

最佳答案

首先,Butter Knife 不是依赖注入(inject)库。您可以将其视为样板简化库,因为它所做的只是替换 findViewById 和各种 setXxxListener 调用。

Butter Knife 要求 View 不是私有(private)的原因是它实际上生成了设置字段的代码。它生成的代码与您的类位于同一个包中,这就是该字段必须是包私有(private)、 protected 或公共(public)的原因。如果该字段是私有(private)的,则生成的代码将无法编译,因为它无法访问私有(private)字段。

生成的代码如下所示:

public static void inject(ExampleActivity target, ExampleActivity source) {
  target.title = (TextView) source.findViewById(R.id.title);
  target.subtitle = (TextView) source.findViewById(R.id.subtitle);
  target.footer = (TextView) source.findViewById(R.id.footer);
}

当您调用 ButterKnife.inject(this) 时,它会查找此生成类并使用您的 ExampleActivity 实例调用 inject 方法字段的目的地和 findViewById 调用的来源。

关于android - Butterknife View 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27244742/

相关文章:

asp.net-mvc-2 - 使用 CaSTLe Windsor 在遗留代码中注入(inject) HttpContext.Current.Session

c# - CaSTLe Windsor 重建实例

android - butterknife 是运行时编译的吗?

java - Android、Butterknife、BindView、最终

android - 从 Android 设备调用方向 API 的谷歌地图错误

android - 如何在 Firebase 中注册用户名?

java - 是否可以使用 Java 配置在 Spring Framework 中编写类似 Guice 的模块?

java - butterknife 库问题

android - JSON对象解析

Android 将 C++ 转换/编译为 Neon