[Android] EditTextなどでキーを押したときのイベントを設定する

アクティビティにOnKeyListenerインターフェイスを実装すると、キーイベント発生時にonKeyメソッドがコールされる。onKeyメソッドの返り値は boolean型で true にすると他のイベントレシーバーへ伝達しなくなる。だから基本的にイベントを処理した場合は true を返す。

package jp.fernweh;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

public class OnKeyEventTest extends Activity implements OnKeyListener {

  LinearLayout layout;
  TextView text;
  EditText textarea;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);
    setContentView(layout);

    text = new TextView(this);
    text.setText("テキストビュー");
    layout.addView(text);

    textarea = new EditText(this);
    textarea.setOnKeyListener(this);
    layout.addView(textarea);
  }

  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event) {

    String s = "KeyCode : ";
    s += keyCode;
    s += "\n";

    // KeyEvent#getAction アクションの種類を取得
    int Action = event.getAction();
    if (Action == KeyEvent.ACTION_UP) {
      s += "Up  アクション\n";
    } else if (Action == KeyEvent.ACTION_DOWN) {
      s += "Downアクション\n";
    } else if (Action == KeyEvent.ACTION_MULTIPLE) {
      // このイベントは何…?
      // multiple duplicate key events have occurred in a row, or a
      // complex string is being delivered.
      // だそう。重複したキーイベント or 複雑な文字入力?
      // しかしどうやればこのイベントが発生するのかわからない
      s += "Multipleアクション\n";
    }

    // KeyEvent#getRepeatCount()
    // Upアクションでは常に ゼロ
    // ボタン長押しで連続入力した回数
    s += "リピート回数";
    s += event.getRepeatCount();
    s += "\n";

    // KeyEvent#getEventTime onKeyイベントが発生した時間を取得
    // BackSpaceあたり長押しするとよくわかるかも
    s += "EventTime : ";
    s += event.getEventTime();
    s += "\n";

    // KeyEvent#getDonwTime 最初に押された時間を取得
    s += "DownTime : ";
    s += event.getDownTime();
    s += "\n";

    // KeyEvent#getScanCode スキャンコードの取得
    // ハードウェアに入力されたキーを返す
    // ハードウェア依存なので使うことはあまり無さそう
    s += "ScanCode : ";
    s += event.getScanCode();
    s += "\n";

    // KeyEvent#getMetaState meta値を取得
    // Shift同時押しとか
    s += "MetaState : ";
    s += event.getMetaState();
    s += "\n";

    text.setText(s);

    return true;
  }

}

Share
関連記事