3

SoftKeyboard IME Android サンプル コードを編集して、カスタム KeyEvent をアプリケーションに渡しました。このKeyEvent Constructorを使用してこれを行います。

private void handleCharacter(int primaryCode, int[] keyCodes) {
  if (isInputViewShown()) {
    if (mInputView.isShifted()) {
      primaryCode = Character.toUpperCase(primaryCode);
    }
  }
  if (isAlphabet(primaryCode)) {
    String characterString = new String();
    for (int c : keyCodes) {
      characterString += (char)c;
    }
  Log.e(TAG, "sending: " + characterString);
  KeyEvent ke = new KeyEvent(SystemClock.uptimeMillis(),
      characterString, 0, KeyEvent.FLAG_CANCELED);
  getCurrentInputConnection().sendKeyEvent(ke);
  }
}

私のアプリケーションには、このスレッドonKey()に従って設定した CustomTextView があり、次のように記述しました。

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
  Log.d(TAG, "onKeyListener");
  CustomEditor context = (CustomEditor) mWeakContext.get();
  assertNotNull("Context invalid", context);

  if (event.getAction() == KeyEvent.ACTION_UP) {
    if (keyCode == KeyEvent.KEYCODE_DELETE) {
      // Handle delete.
      return true;
    }

    if (keyCode == KeyEvent.KEYCODE_SPACE) {
      // Handle space.
      return true;
    }
  }

  // Ignore all non-custom Events.
  if (event.getAction() != KeyEvent.ACTION_MULTIPLE) {
    return true;
  }

  if (keyCode == KeyEvent.KEYCODE_UNKNOWN) {
    Log.e(TAG, event.toString());
    // Pull out characters.
    final String chars = event.getCharacters();
    if (chars != null) {
      // Do some stuff. This is never called!
    }
  }
  return true;
}

ただしevent.getCharacters()、null 以外の文字列を返すことはありません。ここに何か欠けているものはありますか?私が自分の目的のために操作しようとしているこの特定の KeyEvent コンストラクターの使用を管理するドキュメントはあまりありません。

編集: KeyEvent.writeToParcel(...) 関数が文字列をパーセルしない可能性が高いため、KeyEvent が TextView に送信されるとデータが失われます。

この方法で構築された KeyEvent のマーシャリングとアンマーシャリングを試してみましたが、実際には文字列はもう存在しません。この動作は非常に奇妙です。これがなぜなのか誰か知っていますか?

...
KeyEvent ke = new KeyEvent(SystemClock.uptimeMillis(),
      characterString, 0, KeyEvent.FLAG_CANCELED);
// Drop it into a parcel
Parcel p = Parcel.obtain();
ke.writeToParcel(p, 0);
// Get it out of this parcel.
KeyEvent kee = KeyEvent.CREATOR.createFromParcel(p);
Log.e(TAG, "unparcelled cstring: " + kee.getCharacters());
... (etc)

最後のログ ステートメントは常に null を生成します。

4

0 に答える 0