5

入力を処理するビューがあり、キーボードをポップアップして、ビューをフォーカス可能に設定します。これで、特定のキーを押すことができます...

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_DEL) {
    } else if (keyCode == KeyEvent.KEYCODE_BACK) {
    } else if (keyCode == KeyEvent.KEYCODE_ENTER) {
    } else {
    }
}

など...使用して取得した押された文字

event.getDisplayLabel()

通常の文字AZのみが必要な限り、それは機能します。他の言語では、ソフト キーボードで通常の文字を長押しすると、さらに多くの文字にアクセスできます...ただし、これらの代替文字は onKeyDown/Up では検出できません。通常の文字、ソフト キーボードのラベルしか検出できません。今、私のアプリは外国語の入力と文字を処理する必要があります。キーボードをトルコ語に変更し、キーボードで í ú ù のような文字を見つけることができますが、それらを押しても応答がありません。event.getDisplayLabel や event.getUnicodeChar(); では使用できません。これらの文字を検出するにはどうすればよいですか?

4

3 に答える 3

3

キーボードが開いていて、Android がスクリーン キーボードを別のアクティビティと見なすためonKeyDown()onKeyUp()メソッドが正しく機能しない場合。

目的を達成する最も簡単な方法は、ビューでメソッドをオーバーライドすることですonKeyPreIme()。たとえば、EditText から onKeyDown をキャプチャしようとしている場合は、 を拡張する新しい Class を作成し、メソッドEditTextをオーバーライドします。onKeyPreIme()

public class LoseFocusEditText extends EditText {

    private Context mContext;

    protected final String TAG = getClass().getName();

    public LoseFocusEditText(Context context) {
        super(context);
        mContext = context;
    }

    public LoseFocusEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
    }

    public LoseFocusEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mContext = context;
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {

            //hide keyboard
            InputMethodManager mgr = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
            mgr.hideSoftInputFromWindow(this.getWindowToken(), 0);

            //lose focus
            this.clearFocus();

            return true;
        }
        return false;
    }
}

これは kitkat / htc one でテストされました。

于 2014-05-02T00:08:33.927 に答える
2

編集:

onKeyDown がまったく呼び出されない原因がわかりません。あなたの見方の問題なのではないでしょうか?このため、私の解決策よりも良い答えがあるかもしれません。いずれにせよ、これはうまくいくかもしれません:

ビューから onKeyDown を使用する代わりに、dispatchKeyEvent をアクティビティ レベルでオーバーライドします。これにより、ウィンドウ マネージャーに到達する前にキー イベントが処理されるため、明示的に処理しないキー イベントに対して必ず super を呼び出してください。

ACTION_DOWN を使用した例 (すべてのイベントには ACTION_UP と ACTION_DOWN の両方があるため) onKeyDown を使用した例:

@Override
public boolean dispatchKeyEvent(KeyEvent event){
    if(event.getAction() == KeyEvent.ACTION_UP) {
        return super.dispatchKeyEvent(event);
    }

    if (keyCode == KeyEvent.KEYCODE_DEL) {
    } else if (keyCode == KeyEvent.KEYCODE_BACK) {
    } else if (keyCode == KeyEvent.KEYCODE_ENTER) {
    } else {
        return super.dispatchKeyEvent(event);
    }
}

(ごめんなさい)

あなたが試すことができます:

char key = (char)event.getUnicodeChar();

それ以外の

char key = event.getDisplayLabel();

getDisplayLabel() は、キーボードに表示されるキーのみを提供します。ご指摘のとおり、必ずしもユーザーが選択した文字ではありません。

于 2013-01-08T15:37:13.077 に答える