android-discuss
android-discuss copied to clipboard
[问答]Android如何正确的自定义键盘?
Android开发中有时候需要自定义键盘,我按照文档写了一个自定义键盘,大致文件清单如下:
keyboard_123.xml : 描述键盘的布局;
layout_keyboard_view.xml : 配置自定义键盘的各种属性;
MyKeyboard.java : 加载keyboard_123.xml到KeyboardView、处理EditText与KeyboardView的各种事件;
MyKeyboardView.java : 绘制键盘;
这样子的实现方案,我遇到了两个问题:
Q1:键盘会遮挡输入框
如果出现键盘遮挡的情况,自定义的键盘无法像系统键盘那样进行窗口的位移来处理遮挡问题。
Q2:要使用自定义键盘的时候,必须要在界面布局include自定义键盘的layout_keyboard_view.xml
这样子使用起来可能会不方便,比如在RecyclerView、Dialog等情况使用的话,就比较麻烦了。
所以想了解一下大家是如何实现自定义键盘的,或者是有没有方案可以解决上面的两个问题的呢?
Q1:我是将输入框放到scrollview中,自定义键盘弹出的时候,计算edittext高度,如果高度算出来低于软键盘高度就表示被遮挡了,然后算高度差,scrollview滑动高度差的距离,把edittext滑到软键盘上方。
@flyfight88
感谢你的回答。也就是自定义键盘需要在每个需要用到的界面进行特殊处理吗?在 Dialog 或者 RecyclerView 里面的输入框会不会处理起来比较麻烦呢?
补充一个问题:
Q3:如果 ScrollView 内容的实际高度小于屏幕高度,如何让 EditText 滑到软键盘上方?
答:有个不太优雅的方案是:在自定义键盘弹出之前,动态给对应的 ScrollView 加上一个一定高度的透明 View 来保证 ScrollView 足以滑动,在键盘关闭出之后再把该透明 View 从 ScrollView 中移除。
另外,之前在 RN 中自定义键盘,从根 ViewGroup 中遍历到 ScrollView,再往里面加透明 View,但发现不生效。不确定是不是当时写代码的姿势不对,后来没时间就放弃了在 RN 中自定义键盘。
所以,想追问下:
Q4:有没有一个更优雅的方案来解决键盘挡住输入框的问题,达到一个类似系统键盘的效果?
对于 Q2,有个方案是不需要在布局文件中 include
layout_keyboard_view.xml 的,即在 PopupWindow 中 inflate
layout_keyboard_view.xml。
以下有几份代码或文章可供参考,好几年前写的了,有不好的地方自己优化下并请见谅:
- 在xml文件中定义:customkeyboard
- 继承EditText自定义view来实现:customkeyboardbyedittext
- 以Dialog的形式来实现:customkeyboardbydialog