在孩子的父母第一个自定义键盘上调用 removeView()

Posted

技术标签:

【中文标题】在孩子的父母第一个自定义键盘上调用 removeView()【英文标题】:call removeView() on child's parent first custom Keyboard 【发布时间】:2020-10-24 22:35:21 【问题描述】:

我创建了一个自定义键盘,当它从 potrait 切换到 lanscape 时,它​​会出现以下错误并崩溃:

2020-07-04 16:31:38.846 24634-24634/com.nisarg.nboard E/androidRuntime: FATAL EXCEPTION: main
    Process: com.nisarg.nboard, PID: 24634
    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:4939)
        at android.view.ViewGroup.addView(ViewGroup.java:4770)
        at android.view.ViewGroup.addView(ViewGroup.java:4742)
        at android.inputmethodservice.InputMethodService.setInputView(InputMethodService.java:1483)
        at android.inputmethodservice.InputMethodService.updateInputViewShown(InputMethodService.java:1325)
        at android.inputmethodservice.InputMethodService.showWindowInner(InputMethodService.java:1767)
        at android.inputmethodservice.InputMethodService.showWindow(InputMethodService.java:1735)
        at android.inputmethodservice.InputMethodService.resetStateForNewConfiguration(InputMethodService.java:1003)
        at android.inputmethodservice.InputMethodService.onConfigurationChanged(InputMethodService.java:984)
        at android.app.ActivityThread.performConfigurationChanged(ActivityThread.java:4918)
        at android.app.ActivityThread.handleConfigurationChanged(ActivityThread.java:5108)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1731)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:176)
        at android.app.ActivityThread.main(ActivityThread.java:6635)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

我不知道为什么会出现此错误,请有人帮助我。

【问题讨论】:

【参考方案1】:

我找到了,我在 InputMethodService 的 onCreate() 中膨胀视图,在这种情况下,在配置更改后不会调用它,因此将要设置为新对话框的视图(每个键盘都是特殊类型的对话框)它们将附加到前一个父框(假设 setInputView() 方法执行此操作)因此,我复制了那里的代码并将其添加到 onInitializeInterface(),它在创建服务后和配置后都被调用更改,所以我会在每次配置更改时生成新视图,这样它们就不会附加到任何根目录。

【讨论】:

以上是关于在孩子的父母第一个自定义键盘上调用 removeView()的主要内容,如果未能解决你的问题,请参考以下文章

冲突的 Android 错误消息:指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()

指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()

指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView()。 (C#)

Fragments - 指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()

Android - ArrayAdapter<LinearLayout> :指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()

收到错误“指定的孩子已经有父母。您必须先在孩子的父母上调用 removeView()。”? [复制]