У меня есть это диалоговое окно предупреждения с вводом редактирования текста.
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)