andriod 自定义软键盘及解决遮挡文本框问题

       首先建立键盘框架文件:numskeys.xml对应的按键数字对应相应的ASII码,按键宽度和按键高度按照百分比设置。对应按键的功能写在XMLKeysUtils工具类中,对应按键功能写在onKey方法里,遍历数组或者if…else…语句完成。

  drawable文件夹下有keys_board_selector.xmlkeys_normal_shape.xmlkeys_pressed_shape.xml文件,keys_board_selector.xml文件将后两个文件联系到一起,设置触发状态,<item   />类似于if语句,当不按下按键时显示normal状态,当按下时显示pressed状态。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
android:state_pressed="true"
         
android:drawable="@drawable/keys_pressed_shape"/>
    <item
android:drawable="@drawable/keys_normal_shape"/>
</selector>

    keys_normal_shape.xmlkeys_pressed_shape.xml文件中绘制按键的形状颜色背景等。参考博客:https://blog.csdn.net/bear_huangzhen/article/details/24488337

layout文件夹下包含key_board_view.xmlkey_preview_layout.xmlkey_display_view.xml三个文件,其中key_preview_layout.xml文件描述的是键盘按下时候为突出按下的按键额外显示出来的按键,相当于按键放大显示。在key_board_view.xml文件中引用:

android:keyPreviewLayout="@layout/key_preview_layout"

        key_display_view.xml文件将键盘(key_board_view.xml)上绑定一个editText控件,用于显示键盘上输入的信息。

spec_layout.xml文件将键盘与TableLayout控件的输入框写在一起,TableLayout外面套一个LinearLayout。为了使键盘不遮住输入框,在LinearLayout外面在套一个ScrollView,即ScrollView层和includekey_display_view.xml并列,接着外面还有一个LinearLayout

        有必要先阐述一下如何理解的隐藏键盘,本人新手入门这可能是一种超级low的方法:为了隐藏键盘,我一开始想的是能不能把系统内置键盘替换掉,然后在github上找例子看,就做成了把键盘和页面写在一个布局里,默认界面下隐藏的键盘界面,然后在点击editText时候显示键盘,为了区别这个界面上的editText和键盘上带的那个editText,将键盘上的editText记为showText。点击editText时,绑定到showText上,关闭隐藏系统自带键盘,显示自定义软键盘。按确定键时将showText内容写到editText上,取消键时候隐藏软键盘。

遇到的问题:

  1. 点击editText时而显示自定义软键盘时而显示系统自带键盘,于是将禁用系统自带键盘的语句,从屏幕的点击监听事件移到了自定义键盘的构造函数后。然后是点击自定义键盘需要点击两下才能显示键盘,找到原因是editext写的是OnClickListener(),改为setOnTouchListener()就可以在触摸的时候编辑其他editText的信息。
  2. 自定义键盘显示后遮住了下排的editText文本框,要想输入还需要先关闭键盘在点击。想要实现键盘弹出自动上升,不遮挡功能。博客大佬写的好像都是解决系统自带键盘遮住文本框的问题,没找到合适方案,不过这个博客很具有参考价值。http://www.cnblogs.com/loaderman/p/6912736.html    想了个笨方法,将TableLayout外嵌套一个LinerLayout,外面加上ScrollView。将ScrollView和键盘以及showText按照layout_weight占比方式,算出ScrollView在键盘和showText显示时候所占屏幕的高度大小,然后效果是键盘显示时候能手动滚动ScrollView里面的TableLayout,然后输入,但是没有实现自动上升。解决办法是是将scrollView对象与布局绑定,if(点击的是会被挡住的editText)则调用下面语句,将scrollView自动滑上去。
scrollView.fullScroll(ScrollView.FOCUS_DOWN)

         布局时候注意layout_gravitygravity的区别和生效条件。

 

猜你喜欢

转载自blog.csdn.net/qq_32059343/article/details/81367556