O que significam cada elemento dessas instruções:
botaoSalvar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}
O que significam cada elemento dessas instruções:
botaoSalvar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}
Enumerando as linhas, temos esse esquema:
(1) botaoSalvar.setOnClickListener(
(2) new View.OnClickListener() {
(3) @Override
(4) public void onClick(View v) {
}
(5) });
(1): chamamos o método setOnClickListener
na variável de nome botaoSalvar
. Veja que no fim da linha (1) abrimos parênteses, então todo o resto dessas linhas de código é o argumento do método setOnClickListener
.
(2): Ao chamar new
criamos um novo objeto. Esse objeto, entretanto, é uma interface (e não uma classe, como de costume). Essa interface é chamada OnClickListener
e está definida dentro da classe View
. Por isso chamamos View.OnClickListener
.
Como é possível dar new
numa interface se a interface não define o corpo dos métodos? Lembra: a interface só tem a assinatura dos métodos, e não seu corpo.
É só definir o corpo dos métodos da interface na hora do new
. Isso nos leva ao próximo passo...
(4): Esse é o método onClick
, que está definido na interface que chamamos o new
na linha (2). Veja que abrimos chaves no final dessa linha (4) para podermos escrever o corpo desse método (ou até mesmo deixar vazio, como nesse exemplo).
(3): Esse @Override
é o que chamamos de annotation, para indicar ao compilador que a assinatura do método onClick
existe com certeza na interface OnClickListener
. Caso, por um descuido, alteremos a assinatura do onClick
para onClique
, teremos um erro de compilação, pois o onClique
não está definido na interface.
(5): Como abrimos parêntesis lá na linha (1) e abrimos chaves lá na linha (2), aqui fechamos tudo. E colocamos o ponto-e-virgula, para iniciar o término da chamada do método inicial: o setOnClickListener
.