Kotlin自定义Numeric键盘遮挡EditText,求适配调整方案
解决自定义键盘遮挡EditText的问题
一、布局结构调整
先修改布局,把所有EditText放到统一容器内,让这个容器始终位于自定义键盘上方,这样键盘显示时内容区域会自动向上收缩,从布局层面避免遮挡。外层保留ScrollView保证内容过长时可滚动:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scroll_view" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true"> <RelativeLayout android:id="@+id/root_layout" android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- 存放所有EditText的容器 --> <LinearLayout android:id="@+id/content_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@id/keyboardview" android:orientation="vertical" android:padding="16dp"> <EditText android:id="@+id/edittext0" android:layout_width="match_parent" android:layout_height="wrap_content" android:drawableRight="@drawable/hex" android:inputType="text" /> <EditText android:id="@+id/edittext1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:drawableRight="@drawable/txt" android:inputType="text" /> <!-- 其他EditText依次添加 --> </LinearLayout> <android.inputmethodservice.KeyboardView android:id="@+id/keyboardview" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:focusable="true" android:focusableInTouchMode="true" android:visibility="gone" /> </RelativeLayout> </ScrollView>
二、Kotlin代码逻辑处理
- 禁用系统软键盘:确保EditText聚焦时不会弹出系统键盘,强制使用自定义键盘
- 点击EditText时显示键盘并滚动到可见位置:避免输入框被键盘边缘遮挡
- 自定义键盘按键事件处理:实现输入、删除等核心功能
class YourActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.your_layout) val keyboardView = findViewById<KeyboardView>(R.id.keyboardview) val scrollView = findViewById<ScrollView>(R.id.scroll_view) val rootLayout = findViewById<RelativeLayout>(R.id.root_layout) // 初始化自定义数字键盘(替换成你的BaseKeyboard子类实现) val customKeyboard = NumericKeyboard(this, R.layout.your_keyboard_xml) keyboardView.keyboard = customKeyboard // 处理键盘按键事件 keyboardView.setOnKeyboardActionListener(object : KeyboardView.OnKeyboardActionListener { override fun onPress(primaryCode: Int) {} override fun onRelease(primaryCode: Int) {} override fun onKey(primaryCode: Int, keyCodes: IntArray?) { val currentEditText = currentFocus as? EditText ?: return when (primaryCode) { // 删除键逻辑 Keyboard.KEYCODE_DELETE -> { val text = currentEditText.text if (text.isNotEmpty()) { currentEditText.setText(text.subSequence(0, text.length - 1)) currentEditText.setSelection(text.length - 1) } } // 普通数字/字符输入 else -> { val input = Character.toString(primaryCode.toChar()) currentEditText.append(input) } } } override fun onText(text: CharSequence?) {} override fun swipeLeft() {} override fun swipeRight() {} override fun swipeDown() {} override fun swipeUp() {} }) // 批量处理所有EditText val editTexts = listOf( findViewById<EditText>(R.id.edittext0), findViewById<EditText>(R.id.edittext1) // 添加其他EditText ) editTexts.forEach { editText -> // 禁用系统软键盘 editText.showSoftInputOnFocus = false // 点击EditText时显示自定义键盘,并滚动到当前输入框位置 editText.setOnClickListener { keyboardView.visibility = View.VISIBLE // 延迟滚动确保键盘已完成布局 scrollView.post { val targetScrollY = editText.bottom - scrollView.height + keyboardView.height + editText.paddingBottom scrollView.smoothScrollTo(0, targetScrollY.coerceAtLeast(0)) } } } // 点击空白区域隐藏键盘 rootLayout.setOnClickListener { keyboardView.visibility = View.GONE currentFocus?.clearFocus() } } } // 你的自定义数字键盘类示例(继承BaseKeyboard) class NumericKeyboard(context: Context, xmlLayoutResId: Int) : BaseKeyboard(context, xmlLayoutResId) { // 自定义键盘的额外逻辑,比如按键布局调整等 }
三、关键说明
- 布局中
content_container的layout_above="@id/keyboardview"是核心,让内容区域始终在键盘上方,键盘显示时自动挤压内容区域高度 - 通过
scrollView.smoothScrollTo确保当前聚焦的EditText滚动到屏幕可见区域,避免被键盘边缘遮挡 showSoftInputOnFocus = false彻底禁用系统软键盘,符合应用的自定义键盘要求
内容的提问来源于stack exchange,提问作者anpan A
相关产品推荐
相关产品推荐

