Обтекание KeyboardView в ViewGroup: java.lang.IllegalStateException: указанный дочерний элемент уже имеет родителя - PullRequest
1 голос
/ 28 октября 2019

Я использую InputMethodService, Keyboard и KeyboardView (я знаю, это устарело недавно) для создания пользовательской клавиатуры.

  override fun onCreateInputView(): View {
    view = layoutInflater.inflate(
        R.layout.keyboard_view_test,
        null
    )
    keyboardView =
        view.findViewById<KeyboardView>(R.id.keyboard)
    keyboard = Keyboard(this, R.xml.keyboard_layout)
    keyboardView.keyboard = keyboard
    keyboardView.isPreviewEnabled = false
    keyboardView.setOnKeyboardActionListener(this)
    return keyboardView

}

Клавиатура прекрасно работает при использовании KeyboardView в keyboard_view_test.xml в качестве корневого элемента. Когда я начинаю оборачивать его в LinearLayout или любую другую ViewGroup, не меняя ничего другого (см. Keyboard_view_test.xml), я получаю исключение IllegalStateException. Я не понимаю этого, трассировка стека не ссылается ни на один мой код. Как я могу заставить его работать?

keyboard_view_test.xml:

<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="wrap_content"
android:background="@color/colorGboardBackground">

<android.inputmethodservice.KeyboardView
    android:id="@+id/keyboard"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:background="@color/colorGboardBackground"
    android:keyBackground="@drawable/key_background"
    android:keyPreviewLayout="@layout/key_preview"
    android:keyPreviewOffset="10dp"
    android:keyTextColor="@color/colorGboardKeyText"
    android:keyTextSize="22sp"
    android:labelTextSize="22sp"
    android:shadowRadius="0" />

Кажется, ошибка возникает сразу после того, как onCreateInputView () возвращает

Ошибкастек:

 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:5038)
    at android.view.ViewGroup.addView(ViewGroup.java:4869)
    at android.view.ViewGroup.addView(ViewGroup.java:4841)
    at android.inputmethodservice.InputMethodService.setInputView(InputMethodService.java:1596)
    at android.inputmethodservice.InputMethodService.updateInputViewShown(InputMethodService.java:1431)
    at android.inputmethodservice.InputMethodService.showWindowInner(InputMethodService.java:1835)
    at android.inputmethodservice.InputMethodService.showWindow(InputMethodService.java:1803)
    at android.inputmethodservice.InputMethodService$InputMethodImpl.showSoftInput(InputMethodService.java:570)
    at android.inputmethodservice.IInputMethodWrapper.executeMessage(IInputMethodWrapper.java:207)
    at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:37)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:201)
    at android.app.ActivityThread.main(ActivityThread.java:6810)
    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:873)

1 Ответ

1 голос
/ 28 октября 2019

Как указал @Ben P., мне, очевидно, нужно изменить return keyboardView на return view. Сначала я это упустил.

...