11

ソフト キーボードが表示されているときに「戻る」キー イベントをキャプチャしようとしています。

SDK バージョン 8 を使用しており、次のようにソフト キーボードが非表示の場合にのみ、バック キー イベントを正常にキャプチャできます。

@Override
public void onBackPressed() {
    // do something
    super.onBackPressed();
}

問題は、ソフト キーボードが表示されている間、システムがこのメソッドを呼び出していないことです。onKeyDown/Up() メソッドと上記のメソッドをログに記録して、このシナリオで何が起こっているのかを調べてみましたが、役に立ちませんでした。下記参照:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    //DEBUGGING
    Log.d(TAG + "KeyUP", String.valueOf(event));
}

音量キーとメニュー キーのログは期待どおりに返されますが、戻るキーはソフト キーボードとメニューが非表示の場合にのみログに記録されます。

この現象を説明できる「バックキー」の第一人者はいますか?

どんな助けでも大歓迎です。

4

3 に答える 3

14

プレス キー イベントをキャプチャする方法は次のとおりです。 1. editText ビューを拡張して onKeyPreIme をオーバーライドします。

package com.test.test;
import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.EditText;

/**
 * Created by sumit.saurabh on 11/10/16.
 */
public class ChatEditText extends EditText
{
    /* Must use this constructor in order for the layout files to instantiate the class properly */
    public ChatEditText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    private KeyImeChange keyImeChangeListener;

    public void setKeyImeChangeListener(KeyImeChange listener)
    {
        keyImeChangeListener = listener;
    }

    public interface KeyImeChange
    {
        public void onKeyIme(int keyCode, KeyEvent event);
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event)
    {
        if (keyImeChangeListener != null)
        {
            keyImeChangeListener.onKeyIme(keyCode, event);
        }
        return false;
    }
}
  1. xml の ChatEditText

        <com.test.test.ChatEditText
            android:id = "@+id/messageEditText"
            android:layout_width = "match_parent"
            android:layout_height = "wrap_content"
            android:layout_gravity = "bottom"
            android:layout_marginLeft = "12dp"
            android:layout_marginRight = "30dp"
            android:background = "@null"
            android:hint = "Type your message"
            android:inputType = "textMultiLine"
            android:singleLine = "false"
            android:textColorHint = "#c4c0bd"
            android:textSize = "18sp"/>
    
  2. 次に、リスナー (setKeyImeChangeListener) を編集テキストにアタッチします。

    private ChatEditText messageEditText;
    messageEditText =
       (ChatEditText) findViewById(R.id.messageEditText);
    
    messageEditText.setKeyImeChangeListener(new ChatEditText.KeyImeChange(){
        @Override
        public void onKeyIme(int keyCode, KeyEvent event)
        {
            if (KeyEvent.KEYCODE_BACK == event.getKeyCode())
            {
                // do something
            }
        }});
    
于 2016-10-31T10:16:44.440 に答える
8

このサイトと Android API をさらに掘り下げた後、私はそれを発見しました

KeyEvent.KEYCODE_BACK

入力メソッド接続を持ち、その入力メソッドが現在表示されている (つまり、ソフト キーボードは非表示になっていない) IME によって捕捉され、むさぼり食われます。これは、システムが Activity クラスの onKeyDown() または onKeyUp() メソッドを呼び出す前に、イベントが消費されることを意味します。

これを回避するには、IME ウィジェットのサブクラス (TextView または EditText などの子クラス) を作成し、onKeyPreIme()を実装します。

スタック ユーザー i2097i は、アクティビティで onKeyPreIme() を実装するための優れたソリューションを投稿しまし。Android のデフォルトの動作 (つまり、キーボードを閉じる) を維持したい場合は、onKeyPreIme() オーバーライドで必ず FALSE を返すようにしてください。

于 2013-10-30T01:59:51.483 に答える
0

通常、戻るボタンはキーボードを非表示にするため (ネイトの動作)、それで何かをするのは得策ではありません。

于 2013-10-28T14:53:44.560 に答える