2013-10-27 3 views
0

Я работаю над приложением, которое должно быть в состоянии использовать внешние USB-клавиатуры или Bluetooth-клавиатуры. Затем я захватываю KeyEvents и кеширую их по мере необходимости (начальные/конечные часовые).Преобразование списка объектов KeyEvent в строку

Итак, у меня есть списки KeyEvents, которые мне нужно превратить в строки.

Поэтому мне нужно преобразовать эти упорядоченные KeyEvents в правильную строку.

List<KeyEvent> events = new ArrayList<KeyEvent>(); 
String eventString = eventsToString(events); //?????? 

Любые идеи?

ответ

1

После долгих исследований это то, с чем я столкнулся. Я использовал KeyListener, который принимает ключевые события. Затем он добавляется к Editable на основе ключевых событий (рассматривает сдвиги и т. Д.). Код ниже будет просто отражать растущую строку в качестве ключевых событий.

KeyListener tkl = new TextKeyListener(Capitalize.NONE, false); 
Editable et = Editable.Factory.getInstance().newEditable(""); 

View.OnKeyListener key = new View.OnKeyListener() { 
    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if (event.getAction() == KeyEvent.ACTION_DOWN) 
      tkl.onKeyDown(null, et, keyCode, event); 
     else if (event.getAction() == KeyEvent.ACTION_UP) 
      tkl.onKeyUp(null, et, keyCode, event); 
     else 
      tkl.onKeyOther(null, et, event); //NOTE: My devices never used KeyEvent.ACTION_MULTIPLE so I don't know if it should get fired here or with the key down event. 

     Log.i(("Test: " + et.toString()); 
    } 
}; 

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    if (key.onKey(null, event.getKeyCode(), event)) 
     return true; 
    else 
     return super.dispatchKeyEvent(event); 
} 
0

Как насчет использования getDisplayLabel() для каждого события? Что-то вроде:

List<KeyEvent> events = new ArrayList<KeyEvent>(); 
StringBuilder strEvents = new StringBuilder(); 
for (KeyEvent k : events) { 
    strEvents.append(k.getDisplayLabel()) 
    strEvents.append(","); 
} 

String eventString = etrEvents.toString(); 
+0

Я на самом деле не пробовал это, но я знаю, что это не решит мою проблему. Например, если пользовательский клин клавиатуры набрал capitol 'A', ваше решение будет отображать 'LEFT_SHIFT_KEY, a' (или что-то в этом роде). Проблема в том, что я хочу «А», а не «а». Поэтому он должен учитывать специальные ключи и т. Д. – Randy

+0

Итак, я попробовал. Он работает, но только частично. Итак, getDisplayLabel() правильно пишет письма в капитолии, но он не получит «$» вместо «4». Есть идеи? – Randy

0

На основе цикла vaimvolk используется только getUnicodeChar()? http://developer.android.com/reference/android/view/KeyEvent.html#getUnicodeChar()

+0

Такая же проблема. Событие для '$' входит и выглядит ТОЧНО, как и для '4'. Я получаю три события. Я добавлю к своему сообщению, чтобы описать его немного лучше. – Randy

+0

Вы должны получить несколько событий (UP/DOWN и shift), но один из них должен перевести с использованием getUnicodeChar() в $ (в частности, я думаю, что это событие «4 Down». Вы можете следить за тем, как преобразуется keyCode с метастатом здесь : http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/android/view/KeyEvent.java#KeyEvent.getUnicodeChar%28%29 – Raanan

Смежные вопросы