21

2 つの EditText があり (それぞれが 1 文字しか受け付けません)、両方のフィールドを 1 つだけのように処理したいと考えています。

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

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

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

ありがとう!

4

5 に答える 5

15

Android EditText の delete(backspace) キー イベントの重複の可能性

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

    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;
        }
    });

EditText の Android ドキュメントをより明確にするか、少なくとも EditText のガイド - ソフト キーボード インタラクションを提供する必要があるようです。

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

于 2012-08-23T04:16:49.527 に答える
9

私が偶然見つけたこれに対するより簡単な解決策は、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 });

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

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

于 2017-04-09T17:35:03.047 に答える
1

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

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

于 2016-01-18T15:17:22.030 に答える