Ответ 1
Во-первых, Butter Knife не является библиотекой инъекций зависимостей. Вы можете рассматривать его как библиотеку сокращения шаблонов, поскольку все, что она делает, это замена findViewById
и различных вызовов setXxxListener
.
Причина, по которой Butter Knife требует, чтобы представления не были частными, это то, что на самом деле генерирует код, который задает поля. Код, который он генерирует, живет в том же пакете, что и ваш класс, поэтому поле должно быть приватным, защищенным или общедоступным. Если поле было приватным, сгенерированный код не смог бы скомпилироваться, поскольку он не может получить доступ к закрытому полю.
Сгенерированный код выглядит примерно так:
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)
, он ищет этот сгенерированный класс и вызывает метод inject
с вашим экземпляром ExampleActivity
в качестве адресата для полей и источника для вызовов findViewById
.