segunda-feira, 13 de abril de 2015

Explorando libs famosas: Butter Knife

Olá povo,

Nesse post vou falar de mais uma lib famosa entre os desenvolvedores Android.

Butter Knife (http://jakewharton.github.io/butterknife/)
Com ela, você não precisa mais utilizar o bom e velho findViewByid(int) e nem o setOnClickListener ou setOnItemClickListener.
Adicione a dependência no seu build.gradle.
dependencies {
    ...
    compile 'com.jakewharton:butterknife:6.0.0'
}
Depois é só utilizar na sua activity.
public class MainActivity extends ActionBarActivity {

    @InjectView(R.id.edtTexto)
    EditText editText;

    @InjectView(R.id.txtManteiga)
    TextView txtManteiga;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);
    }

    @OnClick(R.id.btnFaca)
    public void meuClick(View v){
        txtManteiga.setText(editText.getText());
    }
}
Partindo do presuposto que temos um EditText, um TextView e um Button, com os respectivos IDs definidos como edtTexto, txtManteiga e btnFaca. O código anterior utiliza a anotação @InjectView para inicializar os componentes após a chamada ButterKnife.inject(this).
Um outro detalhe aqui é o evento de click que podemos definir com a anotação @OnClick.

Podemos utilizar o @Inject não apenas em Activities, mas em qualquer lugar passando a View como parâmetro.
View view = inflater.inflate(
    R.layout.meu_layout, container, false);
ButterKnife.inject(this, view);
O código anterior, poderia estar, por exemplo em um Fragment ou no construtor de um ViewHolder de um adapter.
É importante resetar a injeção das views em Fragments, e isso deve ser feito preferencialmente no onDestroyView().
@Override 
public void onDestroyView() {
  super.onDestroyView();
  ButterKnife.reset(this);
}
Também é possível associar evento de click em itens de uma ListView.
@OnItemSelected(R.id.list_view)
void onItemSelected(int position) {
  // TODO ...
}
Qualquer dúvida, deixem seus comentários.

4br4ç05,
nglauber

4 comentários:

jonathanrz disse...

Nelson,

Na sua opinião, qual a melhor visibilidade para os objetos "injetados"?

Vi que no seu exemplo você deixou visível somente no pacote. Como se o campo for privado a ButterKnife não consegue fazer o bind, eu sempre fico na dúvida se o mais correto é deixar somente no pacote ou protected.

Fernando Oliveira disse...

Muito show Glauber, obrigado pela dica.

PR. ROD e PRA. KARINE disse...

Muito bom! valeu pela dica!!!

Nelson Glauber disse...

Oi Jonathan,

Você não pode utilizar os atributos privados, pois o ButterKnife gera o código do findViewById em tempo de compilação.

Uma explicação completa você encontra aqui:
http://stackoverflow.com/questions/27244742/butterknife-view-injection

4br4ç05,
nglauber