Cómo referenciar nuestras vistas y recursos con Butter Knife

Butter Knife es una excelente librería que nos ayudará a ahorrar código al momento de referenciar elementos de nuestras vistas, recursos del proyecto o hasta referencias eventos que interactúan con el usuario, utilizando connotaciones para cada una de estas.
Para comenzar, compilamos la librería en nuestro archivo gradle con las siguientes dependencias

compile 'com.jakewharton:butterknife:8.0.1'
apt 'com.jakewharton:butterknife-compiler:8.0.1'

Normalmente referenciamos elementos de nuestras vistas de la siguiente forma

class ExampleActivity extends Activity {
  TextView textViewName;
  TextView textViewCity;

  @Override 
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    textViewName = (TextView)findViewById(R.id.textViewName);
    textViewCity = (TextView)findViewById(R.id.textViewCity);
  }
}

Con la librería Butter Knife podríamos hacerlo así

class ExampleActivity extends Activity {
  @BindView(R.id.textViewName) TextView title;
  @BindView(R.id.textViewCity) TextView subtitle;

  @Override 
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);
  }
}

Si estamos dentro de un fragment pasamos la vista a la instancia de ButterKnife

View view = inflater.inflate(R.layout.fragment, container, false);
ButterKnife.bind(this, view);

Es importante liberar la memoria utilizada, una vez que destruyamos el fragment.

// ...
private Unbinder unbinder;
// ...

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  View view = inflater.inflate(R.layout.fragment, container, false);
  unbinder = ButterKnife.bind(this, view);
  return view;
}
@Override 
public void onDestroyView() {
  super.onDestroyView();
  unbinder.unbind();
}

Y a su vez también disponemos de otras connotaciones para para referenciar los recursos de nuestro proyecto, utilizando @BindBool, @BindColor, @BindDimen, @BindDrawable, @BindInt, @BindString

@BindString(R.string.title) String title;
@BindDrawable(R.drawable.graphic) Drawable graphic;
@BindColor(R.color.red) int red;
@BindDimen(R.dimen.left_margin) Float left_margin;

Podemos asignar eventos a los elementos de la vista

@OnClick(R.id.buttonSubmit) void submit() {
  // Aquí nuestro código...
}

Pasar la vista como parámetro

@OnClick(R.id.buttonSubmit) void submit(View view) {
  // Aquí nuestro código...
}

O pasar la posición si corresponde

@OnItemClick(R.id.list_of_things) void onItemClick(int position) {
  // Aquí nuestro código...
}

Tenemos disponible los siguientes eventos para asignar: @OnLongClick, @OnPageChange, @OnTextChanged, @OnTouch, @OnItemLongClick y @OnCheckedChanged. Incluso asignar el evento a varios elementos de una sola vez

@OnClick({R.id.buttonOne, R.id.buttonTwo, R.id.buttonThree})
public void submit(View view) {
  // Aquí nuestro código...
}

Podemos hacer listas de vistas y aplicar propiedades

@BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name })
List<EditText> nameViews;

ButterKnife.apply(nameViews, View.ALPHA, 0.0f);
ButterKnife.apply(nameViews, View.VISIBLE, false);
ButterKnife.apply(nameViews, DISABLE, false);

Finalmente podemos especificar que un elemento de la vista puede ser nulo al momento de referenciarlo o opcional al momento de asignar un evento.

@Nullable @BindView(R.id.might_not_be_there) TextView mightNotBeThere;

@Optional @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() {
  // Nuestro código...
}

Espero que el post haya sido de ayuda y no duden en comentar sus dudas o sugerencias. Saludos!

Comenta este post