I have developed an android custom keyboard which looks almost like one of the original ones. It has also special keys to switch between letters / numbers and shift. all keys seem to work perfectly except the "SPACE" key (the large bar at the bottom). I am able to hit the space bar in the middle but touches on areas on the right and left (appr. 1/3 of the width of the space bar) are not recognized as touches.
I already tried to use another keycode / icon for the space bar or even place the spacebar in another row of the keyboard to see if it is specific to that key or row. But it seems there is a general "maximum"-width a key on a custom keyboards can have...? I'ts also reproducable in all layouts (portrait / landscape / layout-large ...).
Below is my keypad.xml file to define my keyboard. Does anyone know about this issue / limitation?
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="35dp"
android:horizontalGap="3dp"
android:verticalGap="0.2%p"
android:keyHeight="9%p">
<Row android:keyWidth="9%p" >
<Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
<Key android:codes="119" android:keyLabel="w"/>
<Key android:codes="101" android:keyLabel="e"/>
<Key android:codes="114" android:keyLabel="r"/>
<Key android:codes="116" android:keyLabel="t"/>
<Key android:codes="122" android:keyLabel="z"/>
<Key android:codes="117" android:keyLabel="u"/>
<Key android:codes="105" android:keyLabel="i"/>
<Key android:codes="111" android:keyLabel="o"/>
<Key android:codes="112" android:keyLabel="p" />
</Row>
<Row android:keyWidth="9%p" >
<Key android:codes="97" android:keyLabel="a" android:horizontalGap="5%p"
android:keyEdgeFlags="left"/>
<Key android:codes="115" android:keyLabel="s"/>
<Key android:codes="100" android:keyLabel="d"/>
<Key android:codes="102" android:keyLabel="f"/>
<Key android:codes="103" android:keyLabel="g"/>
<Key android:codes="104" android:keyLabel="h"/>
<Key android:codes="106" android:keyLabel="j"/>
<Key android:codes="107" android:keyLabel="k"/>
<Key android:codes="108" android:keyLabel="l"/>
</Row>
<Row android:keyWidth="9%p" >
<Key android:isSticky="true" android:codes="-2" android:keyLabel="▲" />
<Key android:codes="121" android:keyLabel="y"/>
<Key android:codes="120" android:keyLabel="x"/>
<Key android:codes="99" android:keyLabel="c"/>
<Key android:codes="118" android:keyLabel="v"/>
<Key android:codes="98" android:keyLabel="b"/>
<Key android:codes="110" android:keyLabel="n"/>
<Key android:codes="109" android:keyLabel="m"/>
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete"
android:keyWidth="19%p" android:keyEdgeFlags="right"
android:isRepeatable="true" android:horizontalGap="1.5%p"/>
</Row>
<Row android:horizontalGap="3dp"
android:verticalGap="3dp">
<!-- <Key android:codes="-1" android:keyLabel="123" android:keyWidth="10%p"/> -->
<Key android:codes="-1" android:keyLabel="SYM" android:keyWidth="10%p"/>
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
android:keyWidth="68%p" android:isRepeatable="true"/>
<Key android:codes="-11" android:isRepeatable="true" android:keyIcon="@drawable/sym_keyboard_enter" android:keyWidth="19%p" android:keyEdgeFlags="right"/>
</Row>
</Keyboard>
The problem seems to be that the method from Keyboard#getNearestKeys dosent return proper values for wide buttons. I solved the problem by extending the Keyboard class and overriding the getNearestKeys method
this is the code I added:
@Override
public int[] getNearestKeys(int x, int y) {
List<Key> keys = getKeys();
for (int i = 0; i < keys.size(); i++) {
if (keys.get(i).isInside(x, y)) return new int[]{i};
}
return new int[0];
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With