Olá a todos!
Sou usuário do Android Studio e, por termos a opção de “desenharmos” o nosso programa através dos arquivos da pasta layout, pouco paramos para entender o código que vai surgindo por trás. Uma dúvida que me surgiu é a simples instância abaixo:
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(**new** View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
Como disse, trata-se de algo simples: estamos instanciando o objeto fab da classe FloatingActionButton e informando que ele ficará aguardando o toque na tela do celular para executar algo.
A minha dúvida é a palavra reservada “new”, que deixei em negrito. O que eu sei sobre ela é que sua função é alocar espaço na memória para poder criarmos um objeto. Então o que ela está fazendo ali sendo que o objeto (fab) já foi criado?
Desde já,
Agradecido!
O new ali não está criando o objeto fab (que é um FloatingActionButton).
O new ali está criando um objeto View.OnClickListener()
Pra ficar mais claro, você pode alterar o código, deixando a criação do objeto fora. Algo como
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
//criando um objeto View.OnClickListener()
View.OnClickListener viewListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
}
fab.setOnClickListener(viewListener );
Obs: esse código não foi testado e pode ser que as classes referentes sejam diferentes. O objetivo é explicar a ideia do new.
Abraço.
2 curtidas
Obrigado pelo retorno e pelo esclarecimento.
Acabou que surgiu-me uma dúvida, rs.
Eu compreendi a lógica de ficar mais fácil se eu criar o objeto fora (e fica mais fácil mesmo). A sintaxe que você usou foi:
View.OnClickListener viewListener = new View.OnClickListener()
A sintaxe de instanciação de objeto que eu conheço leva apenas a classe no linha. Se eu fosse instanciar, eu teria feito da seguinte forma:
View viewListener = new View()
Estaria errado?
Obrigado!
Não é que estaria errado, é que o código View viewListener = new View() cria um objeto View. Mas o método setOnClickListener quer um ClickListener, o que seria incompatível.
Indo um pouco mais a fundo, quando você faz new View.OnClickListener, está criando uma classe anônima que implementa a interface de mesmo nome (veja aqui).
Essa sintaxe com nome da classe + ponto é só uma facilidade criada pelo pessoal do Android, que “embutiu” essa interface dentro da classe View e a deixou acessível através de um método estático. Eles poderiam ter criado um arquivo separado para essa interface, daí o View. (view ponto) não seria necessário, mas possivelmente um import a mais precisaria ser adicionado quando essa interface fosse ser usada.
Ou seja, é só outro jeito de fazer a coisa.
Abraço.