在孩子的父母第一个自定义键盘上调用 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()