Hi,Last time,I share the RussianIME development blog,the first version of RussianIME used the static way to map the hardkeytable,if the hardware layout is different from the layout that the source said like
private static SparseIntArray sKeyCodeTable = new SparseIntArray();
static {
sKeyCodeTable.append(KeyEvent.KEYCODE_A, '/u0444'); // α
sKeyCodeTable.append(KeyEvent.KEYCODE_B, '/u0442'); // β
sKeyCodeTable.append(KeyEvent.KEYCODE_C, '/u043C'); // Ï
sKeyCodeTable.append(KeyEvent.KEYCODE_D, '/u0432'); // δ
sKeyCodeTable.append(KeyEvent.KEYCODE_E, '/u043A'); // ε
sKeyCodeTable.append(KeyEvent.KEYCODE_F, '/u0430'); // Ï
sKeyCodeTable.append(KeyEvent.KEYCODE_G, '/u043F'); // γ
sKeyCodeTable.append(KeyEvent.KEYCODE_H, '/u0440'); // η
sKeyCodeTable.append(KeyEvent.KEYCODE_I, '/u0449'); // ι
sKeyCodeTable.append(KeyEvent.KEYCODE_J, '/u043E'); // ξ
sKeyCodeTable.append(KeyEvent.KEYCODE_K, '/u043B'); // κ
sKeyCodeTable.append(KeyEvent.KEYCODE_L, '/u0436'); // λ
sKeyCodeTable.append(KeyEvent.KEYCODE_M, '/u0431'); // μ
sKeyCodeTable.append(KeyEvent.KEYCODE_N, '/u044C'); // ν
sKeyCodeTable.append(KeyEvent.KEYCODE_O, '/u0437'); // ο
sKeyCodeTable.append(KeyEvent.KEYCODE_P, '/u0445');
}
and so on,this version can not be used in the new hardware layout,so I thought about another way to fix this problem,using the xml file to map the table,and then in the source code i just read the xml file depends on different hardkey layout.And it makes OK.
For example ,sKeyCodeTable can be replaced as
private static SparseIntArray sKeyCodeTable = new SparseIntArray();
@Override
public void onCreate() {
super.onCreate();
initTable();
>>>>>.>>>>
private void initTable(){
try {
InputStream inputStreamKey;
inputStreamKey = getResources().openRawResource(R.raw.keycode);
keys = ReadService.getEventsFromAnXML(inputStreamKey);
for (Iterator<Key> iterator = keys.iterator(); iterator.hasNext();) {
Key key = (Key) iterator.next();
sKeyCodeTable.append(key.getevent(), key.getValue());
Log.i("KeyString", key.toString());
Log.i("value","" + key.getValue());
}
}catch (XmlPullParserException e) {
e.printStackTrace();
} catch (Throwable e) {
e.printStackTrace();
}
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// read the xml file using the xmlpuller methods
public class ReadService {
public static List<Key> getEventsFromAnXML(InputStream is)
throws Exception
{
XmlPullParser xpp = Xml.newPullParser();
xpp.setInput(is, "utf-8");
int eventType = xpp.getEventType();
List<Key> keys = null;
Key key = null;
while (eventType != XmlPullParser.END_DOCUMENT)
{
switch(eventType){
case XmlPullParser.START_DOCUMENT:
{
keys = new ArrayList<Key>();
break;
}
case XmlPullParser.START_TAG:
{
String tag = xpp.getName();
if("key".equals(tag)){
key = new Key();
key.setName(xpp.getAttributeValue(0));
}else if(key != null){
if("event".equals(tag)){
key.setevent(new Integer(xpp.nextText()));
}else if("value".equals(tag)){
key.setvalue(new Integer(xpp.nextText()));
}
}
break;
}
case XmlPullParser.END_TAG:
{
if (xpp.getName().equalsIgnoreCase("key") && key != null) {
keys.add(key);
key = null;
}
break;
}
}
eventType = xpp.next();
}
is.close();
return keys;
}
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
and the xml file is like that
<Keys>
<key name ="hellomoto">
<value>1109</value>
<keycode>75</keycode>
</Keys>
Share with you.