Android
Cuchillo de mantequilla
Buscar..
Introducción
Butterknife es una herramienta de enlace de vista que utiliza anotaciones para generar código repetitivo para nosotros. Esta herramienta fue desarrollada por Jake Wharton en Square y se usa esencialmente para guardar líneas de código repetitivas como findViewById(R.id.view)
cuando se trata de vistas, lo que hace que nuestro código se vea mucho más limpio.
Para ser claros, Butterknife no es una biblioteca de inyección de dependencias . Butterknife inyecta código en tiempo de compilación. Es muy similar al trabajo realizado por las anotaciones de Android.
Observaciones
Cuchillo de mantequilla
Encuadernación de campos y métodos para las vistas de Android, que utiliza el procesamiento de anotaciones para generar el código de repetición para usted.
- Elimine las llamadas a findViewById usando @BindView en los campos.
- Agrupa múltiples vistas en una lista o matriz. Operar en todos ellos a la vez con acciones, configuradores o propiedades.
- Elimine clases internas anónimas para oyentes anotando métodos con @OnClick y otros.
- Elimine las búsquedas de recursos mediante el uso de anotaciones de recursos en los campos.
Más información: http://jakewharton.github.io/butterknife/
Licencia
Copyright 2013 Jake Wharton
Licenciado bajo la Licencia Apache, Versión 2.0 (la "Licencia"); no puede utilizar este archivo, excepto en cumplimiento con la Licencia. Puede obtener una copia de la licencia en
http://www.apache.org/licenses/LICENSE-2.0
A menos que así lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye "TAL CUAL", SIN GARANTÍAS O CONDICIONES DE NINGÚN TIPO, ya sea explícita o implícita. Consulte la Licencia para el idioma específico que rige los permisos y las limitaciones de la Licencia.
Configurando ButterKnife en tu proyecto
Configure su build.gradle
a nivel de build.gradle
para incluir el complemento android-apt
:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
Luego, aplique el complemento de android-apt
en su build.gradle
nivel de build.gradle
y agregue las dependencias de ButterKnife:
apply plugin: 'android-apt'
android {
...
}
dependencies {
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
Nota: si está utilizando el nuevo compilador Jack con la versión 2.2.0 o posterior, no necesita el complemento android-apt
y puede reemplazar apt con el procesador de annotationProcessor
cuando declare la dependencia del compilador.
Para utilizar las anotaciones de ButterKnife, no debe olvidarse de vincularlas en onCreate()
de sus Actividades o onCreateView()
de sus Fragmentos:
class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Binding annotations
ButterKnife.bind(this);
// ...
}
}
// Or
class ExampleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(getContentView(), container, false);
// Binding annotations
ButterKnife.bind(this, view);
// ...
return view;
}
}
Las instantáneas de la versión de desarrollo están disponibles en el repositorio de instantáneas de Sonatype .
A continuación se muestran los pasos adicionales que tendría que tomar para usar ButterKnife en un proyecto de biblioteca.
Para usar ButterKnife en un proyecto de biblioteca, agregue el complemento a su build.gradle
nivel de build.gradle
:
buildscript {
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
… Y luego aplique a su módulo agregando estas líneas en la parte superior de su build.gradle
nivel de build.gradle
:
apply plugin: 'com.android.library'
// ...
apply plugin: 'com.jakewharton.butterknife'
Ahora asegúrese de usar R2
lugar de R
dentro de todas las anotaciones de ButterKnife.
class ExampleActivity extends Activity {
// Bind xml resource to their View
@BindView(R2.id.user) EditText username;
@BindView(R2.id.pass) EditText password;
// Binding resources from drawable,strings,dimens,colors
@BindString(R.string.choose) String choose;
@BindDrawable(R.drawable.send) Drawable send;
@BindColor(R.color.cyan) int cyan;
@BindDimen(R.dimen.margin) Float generalMargin;
// Listeners
@OnClick(R.id.submit)
public void submit(View view) {
// TODO submit data to server...
}
// bind with butterknife in onCreate
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
// TODO continue
}
}
Encuadernar vistas usando ButterKnife
podemos anotar los campos con @BindView
y una ID de vista para que Butter Knife encuentre y lance automáticamente la vista correspondiente en nuestro diseño.
Vistas obligatorias
Vistas obligatorias en actividad
class ExampleActivity extends Activity {
@BindView(R.id.title) TextView title;
@BindView(R.id.subtitle) TextView subtitle;
@BindView(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...
}
}
Encuadernación de vistas en fragmentos
public class FancyFragment extends Fragment {
@BindView(R.id.button1) Button button1;
@BindView(R.id.button2) Button button2;
private Unbinder unbinder;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fancy_fragment, container, false);
unbinder = ButterKnife.bind(this, view);
// TODO Use fields...
return view;
}
// in fragments or non activity bindings we need to unbind the binding when view is about to be destroyed
@Override
public void onDestroy() {
super.onDestroy();
unbinder.unbind();
}
}
Encuadernar vistas en diálogos
Podemos usar ButterKnife.findById
para buscar vistas en una Vista, Actividad o Diálogo. Utiliza genéricos para inferir el tipo de retorno y realiza automáticamente la conversión.
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);
Vistas vinculantes en ViewHolder
static class ViewHolder {
@BindView(R.id.title) TextView name;
@BindView(R.id.job_title) TextView jobTitle;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
Recursos vinculantes
Aparte de ser útil para vistas de unión, también se podría utilizar butterknife para unirse recursos tales como los que se definen dentro de strings.xml
, drawables.xml
, colors.xml
, dimens.xml
, etc.
public class ExampleActivity extends Activity {
@BindString(R.string.title) String title;
@BindDrawable(R.drawable.graphic) Drawable graphic;
@BindColor(R.color.red) int red; // int or ColorStateList field
@BindDimen(R.dimen.spacer) Float spacer; // int (for pixel size) or float (for exact value) field
@Override
public void onCreate(Bundle savedInstanceState) {
// ...
ButterKnife.bind(this);
}
}
Encuadernación de listas de vistas
Puede agrupar varias vistas en una lista o matriz. Esto es muy útil cuando necesitamos realizar una acción en varias vistas a la vez.
@BindViews({ 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);
//We can use 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);
}
};
Fijaciones opcionales
De forma predeterminada, se requieren los enlaces @Bind
y listener. Se lanza una excepción si no se puede encontrar la vista de destino. Pero si no estamos seguros de si habrá una vista o no, podemos agregar una anotación @Nullable
a los campos o la anotación @Optional
a los métodos para suprimir este comportamiento y crear un enlace opcional.
@Nullable
@BindView(R.id.might_not_be_there) TextView mightNotBeThere;
@Optional
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
// TODO ...
}
Oidores obligatorios usando ButterKnife
OnClick Listener:
@OnClick(R.id.login)
public void login(View view) {
// Additional logic
}
Todos los argumentos del método de escucha son opcionales:
@OnClick(R.id.login)
public void login() {
// Additional logic
}
Tipo específico será casteado automáticamente:
@OnClick(R.id.submit)
public void sayHi(Button button) {
button.setText("Hello!");
}
ID múltiples en un solo enlace para el manejo de eventos comunes:
@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();
}
}
Las vistas personalizadas pueden vincularse a sus propios oyentes al no especificar una ID:
public class CustomButton extends Button {
@OnClick
public void onClick() {
// TODO
}
}
Vistas sin compromiso en ButterKnife
Los fragmentos tienen un ciclo de vida de vista diferente al de las actividades. Al vincular un fragmento en onCreateView, establezca las vistas en nulo en onDestroyView. Butter Knife devuelve una instancia de Unbinder cuando llama a bind para hacer esto por usted. Llame a su método de desvinculación en la devolución de llamada apropiada del ciclo de vida.
Un ejemplo:
public class MyFragment extends Fragment {
@BindView(R.id.textView) TextView textView;
@BindView(R.id.button) Button button;
private Unbinder unbinder;
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
unbinder = ButterKnife.bind(this, view);
// TODO Use fields...
return view;
}
@Override public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
Nota: No se requiere llamar a unbind () en onDestroyView (), pero se recomienda ya que ahorra bastante memoria si su aplicación tiene un backstack grande.
Android Studio ButterKnife Plugin
Android ButterKnife Zelezny
Complemento para generar inyecciones de ButterKnife a partir de XML de diseño seleccionados en actividades / fragmentos / adaptadores.
Nota: asegúrese de hacer el clic derecho para su_xml_layou (R.layout.your_xml_layou
), de lo contrario, el menú Generar no contendrá la opción de inyector de Butterknife.
Enlace: Jetbrains Plugin Android ButterKnife Zelezny