Simplifique o seu código, deixe-o mais legível e pare de escrever tanto código repetitivo nas suas aplicações Android. A biblioteca Butter Knife lhe ajuda a fazer essas coisas e um pouco mais.

Quem desenvolve para a plataforma Android sabe que constantemente temos que escrever estruturas de código repetitivas por toda a aplicação. Como exemplo posso citar o conhecido findViewById. Ele está sempre lá quando precisamos vincular um elemento da tela (XML) a um objeto (JAVA). E muitas vezes temos muitos elementos gráficos, muitos findViewById, muita repetição. Tornando o código grande e mais complexo, visualmente falando.
Além dessa estrutura existem muitas outras com as mesmas consequencias como: listeners, resources (getResources().getColor(), getResources().getString(), etc).
A biblioteca Butter Knife tem uma proposta interessante para solucionar esses problemas.

Conhecendo a biblioteca

A Butter Knife, biblioteca criada por JakeWharton atualmente na versão 7.0.1, visa diminuir a escrita desses códigos repetitivos por meio de annotations. Seu uso é bastante simples, como veremos mais a frente.

Configurando

Para que se possa utilizar a biblioteca basta adicionar a seguinte linha de código nas dependências do build.grade e depois sincronizar o seu projeto:

1
2
3
4
dependencies {
...
compile 'com.jakewharton:butterknife:7.0.1'
}

Adeus findViewById

Exemplo básico de uso:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class ExemploActivity extends ActionBarActivity{
@Bind(R.id.login)
EditText edtLogin;
@Bind(R.id.senha)
EditText edtSenha;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.bind(this);
// TODO Use fields...
}
}

Como pode ser observado, a annotation @Bind inicializa os componentes logo que ButterKnife.bind(this) (linha 13) é chamado, não precisando usar o findViewById. Código bem limpo e legível, não é? ;-)

Nota: para que o bind seja feito as variáveis não podem ser private

Pode-se também realizar o bind em Fragments:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class FancyFragment extends Fragment {
@Bind(R.id.button1)
Button button1;
@Bind(R.id.button2)
Button button2;
@Override public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fancy_fragment, container, false);
ButterKnife.bind(this, view);
// TODO Use fields...
return view;
}
@Override public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
}
}

A diferença do código anterior é que no caso de um Fragment a view é passada como parâmetro no método bind() (linha 8).
Nesse caso deve-se realizar a desvinculação da view no onDestroyView() com o ButterKnife.unbind(this), como mostrado no código acima.

Mas não é só com esses tipos de recursos que a biblioteca permite fazer bind. É possível inicializar strings, cores,etc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class ResourcesActivity extends ActionBarActivity{
@BindString(R.string.userName) //vinculando String
String userName;
@BindColor(R.color.red) //vinculando cor
int mainColor;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.bind(this);
// TODO Use fields...
}
}

Agrupar multiplas views em uma List ou array também é possível.

1
2
@Bind({ R.id.rua, R.id.bairro, R.id.cidade })
List<EditText> nameViews;

Nota: a ButterKnife utiliza geração de código em vez de reflection, uma abordagem bem melhor quando se fala em desempenho.

Listeners

Também podemos diminuir a escrita dos listeners utilizando a Butter Knife.

1
2
3
4
@OnClick(R.id.btSubmit)
public void submit(View view) {
// TODO submit data to server...
}

1
2
3
@OnItemClick(R.id.list_of_things) void onItemClick(int position) {
Toast.makeText(this, "You clicked: " + adapter.getItem(position), LENGTH_SHORT).show();
}
1
2
3
4
@OnItemSelected(R.id.list_view)
void onItemSelected(int position) {
// TODO ...
}

Com apenas uma linha de código inicializamos eventos em botões, itens de listas, etc. Bem legal. :-D

Bem, como vimos aqui a Butter Knife deixa o código muito mais organizado, legível e menor. Particularmente tem me ajudado muitos nos projetos que estou desenvolvendo. Ela possui bem mais recursos do que foi apresentado aqui. Então caso queira conhecer mais essa biblioteca, segue o link do site do projeto: http://jakewharton.github.io/butterknife/.
E o do projeto no gitHub: https://github.com/JakeWharton/butterknife.

Espero ter podido esclarecer e exemplificar aqui o uso desta biblioteca. Caso surjam dúvidas ou sugestões é só deixar o seu comentário.
Até mais.