当前位置: 首页 > 知识库问答 >
问题:

我的Kotlin代码总是出现“指定的子级已经有父级”错误

陈霄
2023-03-14

我试图做一个问答应用程序,在那里你点击加号按钮来添加一个问答。屏幕上弹出一个按钮,你可以点击它来播放或编辑测验。当我点击新创建的按钮一次很好,但第二次点击它时,应用程序崩溃了。有人知道我如何专门修复这个错误吗?

    package com.example.k_ari

import android.content.Intent
import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.Gravity
import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText
import android.widget.LinearLayout
import androidx.appcompat.app.AlertDialog
import com.google.android.material.floatingactionbutton.FloatingActionButton

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        showEditTextDialogue()
    }

    private fun showEditTextDialogue() {
        val btn = findViewById<FloatingActionButton>(R.id.btn)
        btn.setOnClickListener{

            val inflator = layoutInflater
            val layout = findViewById<LinearLayout>(R.id.mainlayout)
            val dialogLayout = inflator.inflate(R.layout.edit_text_layout, null)
            val editText = dialogLayout.findViewById<EditText>(R.id.et_editText)
            val builder = AlertDialog.Builder(this)
            val newbutton = Button(this@MainActivity)
            val btnintent = Intent(this, Newbtn::class.java)
            val dialogLayout2 = inflator.inflate(R.layout.new_button_option, null)

            newbutton.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
            newbutton.width=1010
            newbutton.height=300
            newbutton.gravity = Gravity.CENTER
            newbutton.translationX= 65F
            newbutton.setTextColor(Color.parseColor("#FFFFFFFF"))
            newbutton.setBackgroundColor(Color.parseColor("#250A43"))

            with(builder) {
                setTitle("Title:")
                setPositiveButton("Ok"){dialog, which ->
                    layout.addView(newbutton)
                    newbutton.text = editText.text.toString()
                }
                setNegativeButton("Cancel"){dialog, which ->
                    Log.d("Main", "Negative button clicked")
                }
                setView(dialogLayout)
                show()
            }
            newbutton.setOnClickListener{
                with(builder){
                    setPositiveButton("Play"){dialog, which ->
                        startActivity(btnintent)
                    }
                    setPositiveButton("Edit"){dialog, which ->
                        startActivity(btnintent)
                    }
                    setView(dialogLayout2)
                    show()
            }
        }
    }
}}
 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="56dp"
        android:backgroundTint="#250A43"
        android:backgroundTintMode="add"
        android:clickable="true"
        android:contentDescription="@string/todo"
        android:tint="#250A43"
        android:translationX="280dp"
        android:translationY="580dp"
        app:backgroundTint="#250A43"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.56"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:rippleColor="#FFFFFF"
        app:srcCompat="@android:drawable/ic_input_add"
        android:focusable="true" />
    <ScrollView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:id="@+id/mainlayout"
            android:layout_height="wrap_content"
            android:orientation="vertical">
        </LinearLayout>
    </ScrollView>

</LinearLayout>

2020-12-28 13:48:47.521 266 48-26648/com.example.k_ari E/AndroidRuntime:致命异常:main process:com.example.k_ari,PID:26648 java.lang.IllegalStateException:指定的子进程已经有父进程。必须首先调用子级父级的removeView()。在Androidx.appcomp.appcomp.app.AlertController.setupCustomContent(AlertController.java:657)在Androidx.appcomp.app.comp.app.AlertController.java:475)在Androidx.appcomp.app.alertController.java:233)在Androidx.appcomp.app.comp.app.alertDialog.onCreate(AlertDialog.java:279)在Android.view.viewgroup.addViewWinner(adp.dialog.dispatchoncreate(dialog.java:708)在Android.app.dialog.show(dialog.java:422)在Androidx.appcompat.app.alertdialog$builder.show(alertdialog.java:1009)在com.example.k_ari.mainactivity$showwedittextDialog.java:1$2.2.onclick(mainactivity.kt:66)在Android.widget.textview.performclick(在Android.view.view$PerformClick.r在Android.os.handler.handleCallback(handler.java:938)在Android.os.handler.dispatchMessage(handler.java:99)在Android.os.handler.dispatchMessage(handler.java:246)在Android.app.activityThread.loop(looper.java:246)在Android.app.activityThread.main(activityThread.java:8414)在java.lang.reflect.Method.invoke(原生方法)在30)

共有1个答案

姜奇
2023-03-14

您遇到这种崩溃的原因是因为您的新按钮在这里使用了两次相同的视图:

 newbutton.setOnClickListener{
            with(builder){
                setPositiveButton("Play"){dialog, which ->
                    startActivity(btnintent)
                }
                setPositiveButton("Edit"){dialog, which ->
                    startActivity(btnintent)
                }
                setView(dialogLayout2)
                show()
        }

这里,当单击添加按钮时,DialogLayout2会膨胀,并立即将单击监听器添加到新创建的按钮中。最初DialogLayout2没有父级,直到第一次单击new按钮时,第二次单击DialogLayout2已经有了父级,因此它崩溃了。可能的解决方案是在new按钮单击listener中放大警报对话框布局,如下所示:

newbutton.setOnClickListener{
            val dialogLayout2 = inflator.inflate(R.layout.new_button_option, null)
            with(builder){
                setPositiveButton("Play"){dialog, which ->
                    startActivity(btnintent)
                }
                setPositiveButton("Edit"){dialog, which ->
                    startActivity(btnintent)
                }
                setView(dialogLayout2)
                show()
        }
    }
 类似资料:
  • 问题内容: 在我的应用中,我必须经常在两种布局之间切换。错误在下面发布的布局中发生。 第一次调用布局时,没有发生任何错误,一切都很好。然后,当我调用不同的布局(空白),然后再次调用我的布局时,出现以下错误: 我的布局代码如下所示: 我知道之前曾有人问过这个问题,但对我来说没有帮助。 问题答案: 错误消息说明你应该做什么。

  • 问题内容: 我不知道是否存在问题,但是我想知道为什么在父/子元素上不能使用。 这是一个例子: CSS和HTML: 问题答案: 因为固定位置元素是相对于视口而不是其他元素固定的。因此,由于视口没有切断,因此溢流变得无关紧要。 具有position:absolute的元素的位置和尺寸相对于其包含块,而具有position:fixed的元素的位置和尺寸始终相对于初始包含块。通常是视口:浏览器窗口或纸张的

  • 有人能帮我吗?我不知道为什么我会犯这个错误。

  • 我正在使用3个标签构建一个像WhatsApp一样的应用程序,每个标签都有一个< code >片段。在我的第一个< code >片段中,我有一个< code > recycle view 。 赢取一套SectionsPager适配器,开始宽度Recy,如下图所示: 它给了我这个错误: E/AndroidRuntime:致命异常:主进程:com.deraah.mohamed。deraahpro,PID

  • 我正在尝试将数据提供给我的listView,单击FAB时,它会显示一个对话框,其中包含一个editText和两个按钮。在第一次,它允许我向ListView提供数据。但是当我第二次尝试时,它会显示错误: FATAL EXCEPTION: main Process:com.example.app.wounderlist.wounderlist.HomeFragment, PID: 3790 1.onC

  • 我必须经常在两种布局之间切换。错误发生在下面发布的布局中。 第一次调用我的布局时,没有发生任何错误,一切正常。然后,当我调用另一个布局(空白布局)并再次调用我的布局时,它抛出以下错误: 我的布局代码如下所示: 我知道以前有人问过这个问题,但对我来说没有帮助。