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

[Bug] Problema com AlertDialog de Imagem ao abrir duas vezes seguidas.

Olá Tudo bem ?

Recentemente, implementei a parte da aula que salva imagem no diálogo. Na primeira abertura, tudo funciona corretamente, mas ao fechar e tentar abrir novamente, ocorre um crash com o seguinte erro: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

Já pesquisei no Stack Overflow e tentei diversas soluções, como mover a criação e a instância do diálogo para fora do botão e colocar o create(), mas sem sucesso.

Gostaria de solicitar sua ajuda com o código abaixo, por favor:

class FormularioProdutoActivity : AppCompatActivity() {

private val binding by lazy {
    ActivityFormularioProdutoBinding.inflate(layoutInflater)
}

private var url: String? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(binding.root)

    configuraBotaoSalvar()
    val dialogView = AlertDialog.Builder(this)
    val dialogViewLayout = FormularioImagemBinding.inflate(layoutInflater)
    val botaoCarregarImagem = dialogViewLayout.formularioImagemBotaoCarregar

    binding.activityFormularioProdutoImagem.setOnClickListener {
        botaoCarregarImagem.setOnClickListener {
            url = dialogViewLayout.formularioImagemUrl.text.toString()
            dialogViewLayout.formularioImagemImageview.load(url)
        }
        dialogView.setView(dialogViewLayout.root)
            .setPositiveButton("Confirmar") { dialog, which ->
                url = dialogViewLayout.formularioImagemUrl.text.toString()
                binding.activityFormularioProdutoImagem.load(url)
            }
            .setNegativeButton("Cancelar") { dialog, which ->
                finish() // Ação do botão Cancelar
            }
            .show()
    }
}

}

2 respostas

manda o código no github

solução!

Ja resolvi o problema , Eu criei uma DialogFragment e usei no activity. Segue o codigo baixo :

class AlertDialogCustom : DialogFragment() {

private var _binding: FormularioImagemBinding? = null
private val binding: FormularioImagemBinding get() = _binding!!


override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    _binding = FormularioImagemBinding.inflate(layoutInflater)
    val url = binding.formularioImagemUrl
    carregarImagemBotao(url)

    return activity?.let {
        val builder = AlertDialog.Builder(requireActivity())
            .setView(binding.root)
            .setPositiveButton("Confirmar") { _, _ ->
                (activity as? FormularioProdutoActivity)?.pegarUrlDialogEBotaoSalvar(url.text.toString())
            }
            .setNegativeButton("Cancelar") { _, _ ->
                dismiss()
            }
        builder.create()
    } ?: throw IllegalArgumentException("Activity cannot be null")

}

override fun onStart() {
    super.onStart()
    dialog?.window?.setLayout(
        WindowManager.LayoutParams.MATCH_PARENT,
        WindowManager.LayoutParams.WRAP_CONTENT
    )
}

private fun carregarImagemBotao(url: TextInputEditText) {
    val imageView = binding.formularioImagemImageview
    val botao = binding.formularioImagemBotaoCarregar

    botao.setOnClickListener {
        imageView.tentaCarregarImagem(url.text.toString())
    }
}


override fun onDestroy() {
    super.onDestroy()
    _binding = null
}

Agora na Activity, segue abaixo:

class FormularioProdutoActivity : AppCompatActivity() {

/*Views*/
lateinit var dialogViewLayout: FormularioImagemBinding
private val binding by lazy {
    ActivityFormularioProdutoBinding.inflate(layoutInflater)
}
/*Views*/

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(binding.root)
    dialogViewLayout = FormularioImagemBinding.inflate(layoutInflater)

    binding.activityFormularioProdutoImagem.setOnClickListener {
        AlertDialogCustom().show(supportFragmentManager, "")
    }

}

private fun configuraBotaoSalvar(text: String) {

    val botaoSalvar = binding.activityFormularioProdutoBotaoSalvar
    val dao = ProdutosDao()
    botaoSalvar.setOnClickListener {
        val produtoNovo = criaProduto(text)
        dao.adiciona(produtoNovo)
        finish()
    }

}

private fun criaProduto(url: String): Produto {
    val campoNome = binding.activityFormularioProdutoNome
    val campoDescricao = binding.activityFormularioProdutoDescricao
    val campoValor = binding.activityFormularioProdutoValor

    val nome = campoNome.text.toString()
    val descricao = campoDescricao.text.toString()
    var valorEmTexto = campoValor.text.toString()

    val valor = if (valorEmTexto.isBlank()) {
        BigDecimal.ZERO
    } else {
        BigDecimal(valorEmTexto)
    }

    return Produto(nome = nome, descricao = descricao, valor = valor, imagem = url)
}

fun pegarUrlDialogEBotaoSalvar(url: String) {
    binding.activityFormularioProdutoImagem.tentaCarregarImagem(url)
    configuraBotaoSalvar(url)
}

}