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.