InputmethodService с JetPack Compose - Composeview Причины: Составлено в представление, которое не распространяет ViewTrAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 InputmethodService с JetPack Compose - Composeview Причины: Составлено в представление, которое не распространяет ViewTr

Сообщение Anonymous »

Вы можете найти пример проекта, воспроизводящего проблему, на Github.
Я пытался использовать Jetpack Compose для пользовательского интерфейса клавиатуры. В конечном итоге, когда я пытаюсь раздуть клавиатуру через службу InputMethodService

Код: Выделить всё

class IMEService : InputMethodService() {

override fun onCreateInputView(): View = KeyboardView(this)
}
Используя это представление

Код: Выделить всё

class KeyboardView(context: Context) : FrameLayout(context)  {

init {
val view = ComposeView(context).apply {
setContent {
Keyboard() //
Однако, когда я пытаюсь использовать клавиатуру, я получаю следующую ошибку < /p>
java.lang.IllegalStateException: Composed into the View which doesn't propagate ViewTreeLifecycleOwner!
at androidx.compose.ui.platform.AndroidComposeView.onAttachedToWindow(AndroidComposeView.kt:599)
at android.view.View.dispatchAttachedToWindow(View.java:19676)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3458)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3465)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3465)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3465)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3465)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3465)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3465)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3465)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2126)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1817)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7779)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1031)
at android.view.Choreographer.doCallbacks(Choreographer.java:854)
at android.view.Choreographer.doFrame(Choreographer.java:789)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1016)
at android.os.Handler.handleCallback(Handler.java:914)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:227)
at android.app.ActivityThread.main(ActivityThread.java:7582)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:953)
В официальной документации указано

Вы должны прикрепить ComposeView к ViewTreeLifecycleOwner. ViewTreeLifecycleOwner позволяет многократно присоединять и отсоединять представление, сохраняя при этом композицию. ComponentActivity, FragmentActivity и AppCompatActivity — примеры классов, реализующих ViewTreeLifecycleOwner

Однако я не могу использовать ComponentActivity, FragmentActivity или AppCompatActivity для расширения представления, которое вызывает код создания. Я застрял в реализации ViewTreeLifecycleOwner. Я не знаю, как это сделать.
Как использовать функции @Composable в качестве представления метода ввода?
< Strong>Изменить:
Как предложил CommonsWare, я использовал метод ViewTreeLifecycleOwner.set(...), а также мне пришлось реализовать ViewModelStoreOwner и SavedStateRegistryOwner как ну:

Код: Выделить всё

class IMEService : InputMethodService(), LifecycleOwner, ViewModelStoreOwner,
SavedStateRegistryOwner {

override fun onCreateInputView(): View {
val view = KeyboardView2(this)
ViewTreeLifecycleOwner.set(view, this)
ViewTreeViewModelStoreOwner.set(view, this)
ViewTreeSavedStateRegistryOwner.set(view, this)
return view
}

//Lifecycle Methods

private var lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)

override fun getLifecycle(): Lifecycle {
return lifecycleRegistry
}

private fun handleLifecycleEvent(event: Lifecycle.Event) =
lifecycleRegistry.handleLifecycleEvent(event)

override fun onCreate() {
super.onCreate()
handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
}

override fun onDestroy() {
super.onDestroy()
handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
}

//ViewModelStore Methods
private val store = ViewModelStore()

override fun getViewModelStore(): ViewModelStore = store

//SaveStateRegestry Methods

private val savedStateRegistry = SavedStateRegistryController.create(this)

override fun getSavedStateRegistry(): SavedStateRegistry = savedStateRegistry.savedStateRegistry
}
< /code>
Теперь я получаю новую ошибку < /p>
  java.lang.IllegalStateException: You can consumeRestoredStateForKey only after super.onCreate of corresponding component
at androidx.savedstate.SavedStateRegistry.consumeRestoredStateForKey(SavedStateRegistry.java:77)
at androidx.compose.ui.platform.DisposableUiSavedStateRegistryKt.DisposableUiSavedStateRegistry(DisposableUiSavedStateRegistry.kt:69)
at androidx.compose.ui.platform.DisposableUiSavedStateRegistryKt.DisposableUiSavedStateRegistry(DisposableUiSavedStateRegistry.kt:44)
at androidx.compose.ui.platform.AndroidAmbientsKt.ProvideAndroidAmbients(AndroidAmbients.kt:162)
at androidx.compose.ui.platform.WrappedComposition$setContent$1$1$3.invoke(Wrapper.kt:261)
[...]
Это каким -то образом связано с распространением событий жизненного цикла, потому что, когда я комментирует oncreate и ondestroy Методы, клавиатура работает без сбоев, , но клавиатура не видно


Подробнее здесь: https://stackoverflow.com/questions/657 ... d-into-the
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»