我偶然发现了一个非常有趣的依赖注入(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/