У проблемы с указанным ребенком уже есть родитель - PullRequest
0 голосов
/ 11 марта 2020

У меня есть это диалоговое окно предупреждения с вводом редактирования текста.

 fun Activity.showAlertDialogWithInput(input : EditText, @StringRes messageResId : Int, @StringRes positiveButtonMessage: Int, @StringRes negativeButtonMessage: Int, yesFunc: () -> Unit, noFunc: () -> Unit){

    val alert = AlertDialog.Builder(this)
        .setMessage(messageResId)
        .setView(input)
        .setPositiveButton(positiveButtonMessage) { _: DialogInterface, _: Int -> yesFunc() }
        .setNegativeButton(negativeButtonMessage){ _: DialogInterface, _: Int -> noFunc()}
        .create()
    alert.show()

Проблема возникает, когда я вызываю это более одного раза, потому что я получаю исключение «указанный дочерний объект уже имеет родителя». Я знаю, что должен как-то удалить представление, и я попробовал это так:

 ((ViewGroup)input.getParent()).removeView(input); // <- fix

Но приведение ViewGroup не работает.

Редактировать: StackTrace

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: ro.quik, PID: 26986
    io.reactivex.exceptions.OnErrorNotImplementedException: The exception was not handled due to missing onError handler in the subscribe() method call. Further reading: https://github.com/ReactiveX/RxJava/wiki/Error-Handling | java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
        at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
        at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
        at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)
        at io.reactivex.internal.observers.LambdaObserver.onNext(LambdaObserver.java:67)
        at io.reactivex.internal.util.HalfSerializer.onNext(HalfSerializer.java:107)
        at io.reactivex.internal.operators.observable.ObservableTakeUntil$TakeUntilMainObserver.onNext(ObservableTakeUntil.java:79)
        at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:201)
        at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:255)
        at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:124)
        at android.os.Handler.handleCallback(Handler.java:888)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:213)
        at android.app.ActivityThread.main(ActivityThread.java:8147)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
     Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
        at android.view.ViewGroup.addViewInner(ViewGroup.java:5168)
        at android.view.ViewGroup.addView(ViewGroup.java:4997)
        at android.view.ViewGroup.addView(ViewGroup.java:4969)
        at com.android.internal.app.AlertController.setupCustomContent(AlertController.java:647)
        at com.android.internal.app.AlertController.setupView(AlertController.java:541)
        at com.android.internal.app.AlertController.installContent(AlertController.java:272)
        at android.app.AlertDialog.onCreate(AlertDialog.java:446)
        at android.app.Dialog.dispatchOnCreate(Dialog.java:579)
        at android.app.Dialog.show(Dialog.java:397)
        at ro.quik.ui.extensions.ActivityExtensionsKt.showAlertDialogWithInput(ActivityExtensions.kt:102)
        at ro.quik.ui.features.scan.BarcodeReaderActivity$onStart$2.accept(BarcodeReaderActivity.kt:77)
        at ro.quik.ui.features.scan.BarcodeReaderActivity$onStart$2.accept(BarcodeReaderActivity.kt:26)
        at io.reactivex.internal.observers.LambdaObserver.onNext(LambdaObserver.java:63)
        at io.reactivex.internal.util.HalfSerializer.onNext(HalfSerializer.java:107) 
        at io.reactivex.internal.operators.observable.ObservableTakeUntil$TakeUntilMainObserver.onNext(ObservableTakeUntil.java:79) 
        at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:201) 
        at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:255) 
        at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:124) 
        at android.os.Handler.handleCallback(Handler.java:888) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:213) 
        at android.app.ActivityThread.main(ActivityThread.java:8147) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101) 
...