Anonymous
Клавиши не нажимаются на пользовательской клавиатуре во Flutter Android
Сообщение
Anonymous » 12 янв 2026, 21:37
Я разработал собственную клавиатуру во Flutter в Android, и я сделал пользовательский интерфейс таким же, как и обычная клавиатура, и она выглядит так же, но когда я нажимаю на клавиши, они не нажимаются, так почему это происходит, может ли кто-нибудь мне помочь в этом?
Что я сделал, описано здесь
Код: Выделить всё
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
сначала я попробовал добавить только 4 клавиши, которые были намного больше, я попробовал это для тестирования, и они работали, а также нажимались, так это потому, что на этой клавиатуре клавиши маленькие, но в обычном Gboard клавиши выглядят только так
Пожалуйста, дайте мне знать, если я что-то упускаю
Подробнее здесь:
https://stackoverflow.com/questions/798 ... er-android
1768243067
Anonymous
Я разработал собственную клавиатуру во Flutter в Android, и я сделал пользовательский интерфейс таким же, как и обычная клавиатура, и она выглядит так же, но когда я нажимаю на клавиши, они не нажимаются, так почему это происходит, может ли кто-нибудь мне помочь в этом? Что я сделал, описано здесь [code] 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() } } [/code] [code]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 [/code] [code]keyboard_view.xml [/code] сначала я попробовал добавить только 4 клавиши, которые были намного больше, я попробовал это для тестирования, и они работали, а также нажимались, так это потому, что на этой клавиатуре клавиши маленькие, но в обычном Gboard клавиши выглядят только так Пожалуйста, дайте мне знать, если я что-то упускаю Подробнее здесь: [url]https://stackoverflow.com/questions/79865884/keys-are-not-tappable-in-custom-keyboard-in-flutter-android[/url]