Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Refatoração de funções e lambdas

Olá, eu queria saber como funciona pra saber como refatorar pra função, por exemplo, eu queria fazer um clique de botão e no Android ele já vem associado a uma função setOnClickListener, certo, tem como separar numa função, se faz isso ou não?

Outra coisa que eu tentei fazer foi separar o alert dialog também, mas não sabia como passar a função de carregar as imagens, pra não repetir o código. Por exemplo:

fun carregaImagem(){
     val bindingFormularioImagem = FormularioImagemBinding.inflate(layoutInflater)
       bindingFormularioImagem.formularioImagemBotaoCarregar.setOnClickListener {
           val url = bindingFormularioImagem.formularioImagemUrl.text.toString()
           bindingFormularioImagem.formularioImagemImageView.load(url){
           }
       }
   }

fun AbreDialog(bindingFormularioImagem: FormularioImagemBinding){
 AlertDialog.Builder(this)
       .setView(bindingFormularioImagem.root)//antes sem o binding .setView(R.layout.formulario_imagem)
       .setPositiveButton("Confirmar") { _, _ ->
           url = bindingFormularioImagem.formularioImagemUrl.text.toString()
           binding.activityFormularioProdutoImagem.load(url)
       }
       .setNegativeButton("Cancelar") { _, _ -> }
       .show()

 .setPositiveButton("Confirmar") { _, _ ->
           carregarImagem(url)
       }
}

Código original

binding.activityFormularioProdutoImagem.setOnClickListener {
   val bindingFormularioImagem = FormularioImagemBinding.inflate(layoutInflater)
   bindingFormularioImagem.formularioImagemBotaoCarregar.setOnClickListener {
       val url = bindingFormularioImagem.formularioImagemUrl.text.toString()
       bindingFormularioImagem.formularioImagemImageView.load(url){
       }
   }

   AlertDialog.Builder(this)
       .setView(bindingFormularioImagem.root)//antes sem o binding .setView(R.layout.formulario_imagem)
       .setPositiveButton("Confirmar") { _, _ ->
           url = bindingFormularioImagem.formularioImagemUrl.text.toString()
           binding.activityFormularioProdutoImagem.load(url)
       }
       .setNegativeButton("Cancelar") { _, _ -> }
       .show()
}
2 respostas
solução!

Olá Gisele, tudo bem?

Para o primeiro caso de passar uma função no setOnClickListener, você pode utilizar essa solução:

binding.button.setOnClickListener(::handleClick)

fun handleClick(view: View) {
    ... faça seu código aqui
}

Podemos usar a notação :: antes da função para passar como parâmetro, e a função precisa ter um objeto do tipo view no seus parâmetros para funcionar corretamente.

Agora para o segundo caso, podemos separar a lógica desta forma:

fun carregarImagem(binding: FormularioImagemBinding) {
   val url = binding.formularioImagemUrl.text.toString()
   binding.activityFormularioProdutoImagem.load(url)
}

fun abrirDialog() {
   val bindingFormularioImagem = FormularioImagemBinding.inflate(layoutInflater)
   bindingFormularioImagem.formularioImagemBotaoCarregar.setOnClickListener {
       carregarImagem(bindingFormularioImagem)
   }

   AlertDialog.Builder(this)
       .setView(bindingFormularioImagem.root)
       .setPositiveButton("Confirmar") { _, _ ->
           carregarImagem(bindingFormularioImagem)
       }
       .setNegativeButton("Cancelar") { _, _ -> }
       .show()
}

binding.activityFormularioProdutoImagem.setOnClickListener {
   abrirDialog()
}

Não esqueça de utilizar corretamente a classe de Binding como parâmetro.

Qualquer dúvida estarei à disposição :)

Muito obrigada, não conhecia:

binding.button.setOnClickListener(::handleClick)

E a segunda, acho que eu estava separando de forma errada, muito obrigada, isso é algo que vai ser muito útil.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software