android-discuss icon indicating copy to clipboard operation
android-discuss copied to clipboard

[问答]Android如何正确的自定义键盘?

Open danielzwhe opened this issue 6 years ago • 4 comments

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等情况使用的话,就比较麻烦了。

所以想了解一下大家是如何实现自定义键盘的,或者是有没有方案可以解决上面的两个问题的呢?

danielzwhe avatar Oct 22 '18 09:10 danielzwhe

Q1:我是将输入框放到scrollview中,自定义键盘弹出的时候,计算edittext高度,如果高度算出来低于软键盘高度就表示被遮挡了,然后算高度差,scrollview滑动高度差的距离,把edittext滑到软键盘上方。

flyfight88 avatar Nov 02 '18 00:11 flyfight88

@flyfight88
感谢你的回答。也就是自定义键盘需要在每个需要用到的界面进行特殊处理吗?在 Dialog 或者 RecyclerView 里面的输入框会不会处理起来比较麻烦呢?

danielzwhe avatar Nov 04 '18 14:11 danielzwhe

补充一个问题:

Q3:如果 ScrollView 内容的实际高度小于屏幕高度,如何让 EditText 滑到软键盘上方?

答:有个不太优雅的方案是:在自定义键盘弹出之前,动态给对应的 ScrollView 加上一个一定高度的透明 View 来保证 ScrollView 足以滑动,在键盘关闭出之后再把该透明 View 从 ScrollView 中移除。

另外,之前在 RN 中自定义键盘,从根 ViewGroup 中遍历到 ScrollView,再往里面加透明 View,但发现不生效。不确定是不是当时写代码的姿势不对,后来没时间就放弃了在 RN 中自定义键盘。

所以,想追问下:

Q4:有没有一个更优雅的方案来解决键盘挡住输入框的问题,达到一个类似系统键盘的效果?

zhuanghongji avatar Dec 20 '18 00:12 zhuanghongji

对于 Q2,有个方案是不需要在布局文件中 include layout_keyboard_view.xml 的,即在 PopupWindow 中 inflate layout_keyboard_view.xml。

以下有几份代码或文章可供参考,好几年前写的了,有不好的地方自己优化下并请见谅:

  1. 在xml文件中定义:customkeyboard
  2. 继承EditText自定义view来实现:customkeyboardbyedittext
  3. 以Dialog的形式来实现:customkeyboardbydialog

Android 总结:自定义键盘实现原理和三种实例详解

zhuanghongji avatar Dec 20 '18 01:12 zhuanghongji