Inyección de Butterknife View

Me tropecé con una biblioteca de inyección de dependencia muy interesante llamada ButterKnife . Usando ButterKnife es fácilmente posible inyectar Views en actividades o fragmentos.

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

Sin embargo, si se usa Inyección de Dependencia, esas Vistas deben ser public para que Butterknife pueda inyectarlas (usando campos private campos de excepción fields must not be private or static ).

En mi proyecto pasado siempre hice todos los campos de miembro (incluyendo las opiniones) private como pensé que esto es la mejor práctica (la información que oculta etc.) ahora me estoy preguntando si hay una razón por la que uno no debe hacer todos los puntos de vista public ? En este caso no puedo usar ButterKnife pero quiero usarlo porque simplifica mucho el código.

En primer lugar, Butter Knife no es una biblioteca de inyección de dependencia. Usted puede pensar en ello como una biblioteca de reducción de calidades ya que todo lo que hace es reemplazar findViewById y varias llamadas setXxxListener .

La razón por la que Butter Knife requiere que las vistas no sean privadas es que en realidad genera código que establece los campos. El código que genera vive en el mismo paquete que tu clase, por lo que el campo debe ser privado, protegido o público. Si el campo fuera privado el código generado no podría compilar ya que no puede tener acceso al campo privado.

El código generado se parece a esto:

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

Cuando llama a ButterKnife.inject(this) busca esta clase generate y llama al método inject con su instancia de ExampleActivity como el destino de los campos y el origen de findViewById llamadas findViewById .

  • ¿Cómo inyectar una dependencia al probar una actividad de Android sin un marco de terceros?
  • Manejo del componente de la daga en el cambio de orientación
  • Daga 2 - dos proporciona el método que proporcionan la misma interfaz
  • Ventajas de inyectar el autobús de eventos de Otto en lugar de usar singleton estático
  • Dagger gráfico de actividad y módulos separados
  • ¿Cómo inyectar la dependencia al fragmento androide anidado?
  • Dagger 2 en Android: inyectar la misma dependencia en Activity y retener Fragment
  • ¿Cómo obfuscate el proyecto con Dagger 2.0 usando Proguard?
  • @Named proveedores con los mismos tipos de retorno terminan dando java.lang.IllegalArgumentException: Duplicar
  • Los objetos inyectados se convirtieron en nulos después de actualizar a Roboguice 3
  • Lazy Injection con Dagger 2 en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.