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:
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.
Muito show Glauber, obrigado pela dica.
Muito bom! valeu pela dica!!!
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
Postar um comentário