Kotlin диалоговое окно java.lang.IllegalStateException: указанный дочерний элемент уже имеет родителя.Сначала вы должны вызвать removeView () у родителя - PullRequest
0 голосов
/ 24 июня 2018

Как только пользователь нажимает на change_account в моей активности, появляется диалоговое окно, а затем, когда пользователь нажимает кнопку "Создать счетчик" в этом диалоговом окне, я хочу показать другое диалоговое окно.

Но, к сожалению, я получилэта ошибка:

E / AndroidRuntime: FATAL EXCEPTION: main
java.lang.IllegalStateException: у указанного дочернего элемента уже есть родительский элемент.Сначала вы должны вызвать removeView () на родительском объекте ребенка.

Я видел в сети некоторый код для removeView (), но я не знаю, как его использовать.Тем более, что я вызываю диалог из другого диалога.

и вот мой код, строка, которая вызывает ошибку, состоит в том, что один

 creatCount.create().apply { show() }

А вот полный код:

class ClientAcountActivity : AppCompatActivity(),AdapterView.OnItemClickListener{

    override fun onCreate(savedInstanceState: Bundle?) {

        ....

        change_account.setOnClickListener { openChangeCompte() }

    }


    fun openChangeCompte()
    {
        val dialogBuilder = AlertDialog.Builder(this)
        val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        val row = inflater.inflate(R.layout.dialog_listview, null, false)
        val listAccount= row.findViewById<ListView>(R.id.transfer_type_list)
        Log.d("ClientAccountActivity", Injection.provideAccountRepository().availableAccountsType.toString())
        listAccount.adapter = CountChangeAdapter(Injection.provideAccountRepository().availableAccountsType, this)

       listAccount.onItemClickListener = AdapterView.OnItemClickListener { adapterView: AdapterView<*>, view: View, i: Int, id: Long ->

           if((adapterView.getCount()!=4) && (i==adapterView.getCount()-1))
                {
                     val creatCount: AlertDialog.Builder = AlertDialog.Builder(this).apply {
                           setView(row)
                           setTitle("Quel compte voulez vous créer ")
                           setPositiveButton("OK",  DialogInterface.OnClickListener() {
                               dialogInterface: DialogInterface, i: Int ->
                               fun onClick(dialog:DialogInterface , which:Int) {
                           }})
                           setNegativeButton("Cancel",  DialogInterface.OnClickListener() {
                               dialogInterface: DialogInterface, i: Int ->
                               fun  onClick(dialog:DialogInterface ,  which:Int) {
                                   finish()
                           }})
                       }
                    creatCount.create().apply { show() } //the line which cause the pb 

                }
                else
                {
                    Injection.provideAccountRepository().selectedAccount=id.toInt()
                    updateBalance()
                    changeAccoutDialog!!.dismiss()
                }
            }
        dialogBuilder.setView(row)
        dialogBuilder.setTitle("Quel compte voulez vous choisir?")
        changeAccoutDialog = dialogBuilder.create().apply { show() }
    }
}

1 Ответ

0 голосов
/ 25 июня 2018

Проблема здесь связана с установкой строки переменной в виде двух диалогов: вам нужно создать вторую строку (с той же разметкой, использующей инфлятор), чтобы установить ее во втором диалоге.Вот исправленный код:

fun openChangeCompte()
{
    val dialogBuilder = AlertDialog.Builder(this)
    val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
    val row = inflater.inflate(R.layout.dialog_listview, null)
    val listAccount= row.findViewById<ListView>(R.id.transfer_type_list)
    Log.d("ClientAccountActivity", Injection.provideAccountRepository().availableAccountsType.toString())
    listAccount.adapter = CountChangeAdapter(Injection.provideAccountRepository().availableAccountsType, this)

    listAccount.onItemClickListener = AdapterView.OnItemClickListener { adapterView: AdapterView<*>, view: View, i: Int, id: Long ->

        if((adapterView.count !=4) && (i==adapterView.count -1))
        {
            val row2 = inflater.inflate(R.layout.dialog_listview, null)
            val listAccount= row2.findViewById<ListView>(R.id.transfer_type_list)
            val creatCount: AlertDialog.Builder = AlertDialog.Builder(this).apply {
                setView(row2)
                setTitle("Quel compte voulez vous créer ")
                setPositiveButton("OK") { _: DialogInterface, _: Int ->
                    fun onClick(dialog:DialogInterface , which:Int) {
                    }}
                setNegativeButton("Cancel") { _: DialogInterface, _: Int ->
                    fun  onClick(dialog: DialogInterface, which:Int) {
                        finish()
                    }}
            }
            creatCount.create().apply { show() } //the line wich cause the pb

        }
        else
        {
            Injection.provideAccountRepository().selectedAccount=id.toInt()
            updateBalance()
            changeAccoutDialog !!.dismiss()
        }
    }
    dialogBuilder.setView(row)
    dialogBuilder.setTitle("Quel compte voulez vous choisir?")
    changeAccoutDialog = dialogBuilder.create().apply { show() }
}
...