web-dev-qa-db-ja.com

ソフトキーボードの削除ボタンを検出する

EditTextが2つあり(それぞれ1文字しか受け入れません)、1つしかなかったように両方のフィールドを処理します。

ユーザーが最初の文字に文字を書き込んだときに、TextWatcherを使用して2番目の文字にフォーカスを設定していますが、その逆の方法はわかりません。

ユーザーが2番目のEditText(このEditTextは空)で削除ボタンを押すと、フォーカスを最初のEditTextに移動して、そこの文字を削除します。

問題は、ユーザーが空のフィールドを削除しようとしたときにTextWatcherが機能しないことです(実際には何も変更されていないため)。また、onKeyDownイベントはハードキーボードでのみ機能するため、この問題に対処する方法がわかりません...

ありがとう!

19
michael_ferl

Android EditText delete(backspace)key event の重複の可能性

レイアウトの2つの編集だけでテストプロジェクトを使用して、その質問(実際には提供された質問に由来し、Labeeb Pによって回答された)のコードをチェックしたところ、問題なく動作しているようです-編集が削除されても削除を受け取ることができます空の。

    final EditText edit1 = (EditText) findViewById(R.id.editText1);

    edit1.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // You can identify which key pressed buy checking keyCode value
            // with KeyEvent.KEYCODE_
            if (keyCode == KeyEvent.KEYCODE_DEL) {
                // this is for backspace
                Log.e("IME_TEST", "DEL KEY");
            }
            return false;
        }
    });

思われますAndroid EditTextのドキュメントをより明確にするか、少なくともEditText-ソフトキーボードインタラクションのガイドを提供する必要があります。これは、ほとんどすべての開発者が解決する必要がある典型的なものが多いためです。

UPDATE:この方法は最新(少なくとも4.1以降)では機能しないようですAndroidバージョン。 この答え は4.1以降のバージョンで動作するようです。

11
sandrstar

私が偶然見つけたこれに対するより簡単な解決策は、 InputFilter を使用することです。 InputFilterのfilter()メソッドは、EditTextの値が変化しないものも含めて、すべてのソフトキーボードイベントを報告するように見えます。

したがって、特定の状況に対処するには、入力フィルターを作成し、それに応じて設定します。

_private InputFilter filter = (charSequence, start, end, dest, dStart, dEnd) -> {

    if (end == 0 || dStart < dEnd) {
        // backspace was pressed! handle accordingly
    }

    return charSequence;
};

...

myEditText.setFilters(new InputFilter[] { filter });
_

バックスペースイベントは、enddStart、およびdEndを使用して評価できます。文字が削除された場合、dStartは常にdEndより小さくなります。 EditTextが空の場合でも、end == 0かどうかを確認することで、バックスペースプレスを評価できます。

一括削除もこのifステートメントでキャッチされるため、filter()を使用して追加のチェックを行うことができます。また、コンピューターのキーボードを使用してエミュレーターでEditTextsに入力すると、予期しない結果が生じる可能性があります。テスト用のソフトウェアボタンをクリックするのが最適です。

8
AlexOlsen

https://github.com/ciasaboark/Android-Shell/blob/master/src/com/example/com/programmingthetux/tutorial/ZanyEditText.Java にある拡張機能を使用します

import Java.util.Random;

import Android.content.Context;
import Android.util.AttributeSet;
import Android.view.KeyEvent;
import Android.view.inputmethod.EditorInfo;
import Android.view.inputmethod.InputConnection;
import Android.view.inputmethod.InputConnectionWrapper;
import Android.widget.EditText;
/**
 * Created by mkallingal on 4/25/2016.
 */
public class CustomEditText extends EditText {

    private Random r = new Random();

    public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomEditText(Context context) {
        super(context);
    }

    public void setRandomBackgroundColor() {

    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        return new ZanyInputConnection(super.onCreateInputConnection(outAttrs),
                true);
    }

    private class ZanyInputConnection extends InputConnectionWrapper {

        public ZanyInputConnection(InputConnection target, boolean mutable) {
            super(target, mutable);
        }

        @Override
        public boolean sendKeyEvent(KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN
                    && event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
                CustomEditText.this.setRandomBackgroundColor();
                // Un-comment if you wish to cancel the backspace:
                // return false;
            }
            return super.sendKeyEvent(event);
        }


        @Override
        public boolean deleteSurroundingText(int beforeLength, int afterLength) {
            // magic: in latest Android, deleteSurroundingText(1, 0) will be called for backspace
            if (beforeLength == 1 && afterLength == 0) {
                // backspace
                return sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
                        && sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
            }

            return super.deleteSurroundingText(beforeLength, afterLength);
        }

    }
}

これで、アクティビティで次のように使用できます。

final CustomEditText editText = new CustomEditText(cxt);

editText.setOnKeyListener(new View.OnKeyListener() {
                    @Override
                    public boolean onKey(View v, int keyCode, KeyEvent event) {
                        if (keyCode == KeyEvent.KEYCODE_DEL) {
                            String _text= editText.getText().toString();
                            if(StringUtils.isBlank(_text))
                                 //editText is now empty
                            }
                        }
                        return false;
                    }
                });
4
Irshu

EditTextメソッドを含むInputConnectionオブジェクトにアクセスするためにdeleteSurroundingTextをオーバーライドすることでそれを実現しました。削除(バックスペース)イベントの検出に役立ちます。私がここで提供したソリューションを見てください: Android-バックスペースをキャプチャできない/ソフトでキーボードを押して削除できない

このソリューションは、hardKeyboardとsoftKeyboardの両方で正しく機能します。

1
Ayaz Alifov