Что я сделал, описано здесь
Код: Выделить всё
RewriterKeyboardService.kt
package com.arleven.rephraseplus
import android.inputmethodservice.InputMethodService
import android.view.View
import android.widget.Button
import android.widget.FrameLayout
import android.view.inputmethod.InputConnection
import io.flutter.embedding.android.FlutterView
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.embedding.engine.dart.DartExecutor
import io.flutter.plugin.common.MethodChannel
import io.flutter.FlutterInjector
class RewriteKeyboardService : InputMethodService() {
private var inputConnection: InputConnection? = null
private lateinit var flutterEngine: FlutterEngine
override fun onStartInput(attribute: android.view.inputmethod.EditorInfo?, restarting: Boolean) {
super.onStartInput(attribute, restarting)
inputConnection = currentInputConnection
}
override fun onCreateInputView(): View {
val view = layoutInflater.inflate(R.layout.keyboard_view, null)
val flutterContainer = view.findViewById(R.id.flutter_toolbar_container)
attachFlutterToolbar(flutterContainer)
setupKeyboard(view)
return view
}
private fun setupKeyboard(view: View) {
val letterKeys = listOf(
"Q","W","E","R","T","Y","U","I","O","P",
"A","S","D","F","G","H","J","K","L",
"Z","X","C","V","B","N","M"
)
letterKeys.forEach { key ->
val resId = resources.getIdentifier(
"key_${key.lowercase()}",
"id",
packageName
)
if (resId != 0) {
view.findViewById(resId)?.setOnClickListener {
inputConnection?.commitText(key, 1)
}
}
}
// Space
view.findViewById(R.id.key_space)?.setOnClickListener {
inputConnection?.commitText(" ", 1)
}
// Backspace
view.findViewById(R.id.key_backspace)?.setOnClickListener {
inputConnection?.deleteSurroundingText(1, 0)
}
// Enter
view.findViewById(R.id.key_enter)?.setOnClickListener {
inputConnection?.sendKeyEvent(
android.view.KeyEvent(
android.view.KeyEvent.ACTION_DOWN,
android.view.KeyEvent.KEYCODE_ENTER
)
)
}
}
private fun attachFlutterToolbar(container: FrameLayout) {
flutterEngine = FlutterEngine(this)
flutterEngine.dartExecutor.executeDartEntrypoint(
DartExecutor.DartEntrypoint(
FlutterInjector.instance()
.flutterLoader()
.findAppBundlePath(),
"keyboardToolbarMain"
)
)
val flutterView = FlutterView(this)
val density = resources.displayMetrics.density
val toolbarHeightPx = (56 * density).toInt()
flutterView.layoutParams = FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
toolbarHeightPx
)
// 🔥 THIS IS THE KEY FIX
flutterView.setOnTouchListener { _, _ ->
false // 👈 DO NOT CONSUME TOUCH EVENTS
}
flutterView.isClickable = false
flutterView.isFocusable = false
flutterView.isFocusableInTouchMode = false
flutterView.attachToFlutterEngine(flutterEngine)
container.addView(flutterView)
}
override fun onEvaluateFullscreenMode(): Boolean = false
override fun onDestroy() {
if (::flutterEngine.isInitialized) {
flutterEngine.destroy()
}
super.onDestroy()
}
}
Код: Выделить всё
styles.xml
match_parent
48dp
horizontal
center
6dp
0dp
1
match_parent
3dp
true
true
true
@drawable/key_bg
#000000
16sp
@drawable/key_bg_special
5
@drawable/key_bg_wide
false
true
false
false
@android:color/transparent
Код: Выделить всё
keyboard_view.xml
Пожалуйста, дайте мне знать, если я что-то упускаю
Подробнее здесь: https://stackoverflow.com/questions/798 ... er-android