EditTextが2つあり(それぞれ1文字しか受け入れません)、1つしかなかったように両方のフィールドを処理します。
ユーザーが最初の文字に文字を書き込んだときに、TextWatcherを使用して2番目の文字にフォーカスを設定していますが、その逆の方法はわかりません。
ユーザーが2番目のEditText(このEditTextは空)で削除ボタンを押すと、フォーカスを最初のEditTextに移動して、そこの文字を削除します。
問題は、ユーザーが空のフィールドを削除しようとしたときにTextWatcherが機能しないことです(実際には何も変更されていないため)。また、onKeyDownイベントはハードキーボードでのみ機能するため、この問題に対処する方法がわかりません...
ありがとう!
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以降のバージョンで動作するようです。
私が偶然見つけたこれに対するより簡単な解決策は、 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
より小さくなります。 EditText
が空の場合でも、end
== 0かどうかを確認することで、バックスペースプレスを評価できます。
一括削除もこのif
ステートメントでキャッチされるため、filter()
を使用して追加のチェックを行うことができます。また、コンピューターのキーボードを使用してエミュレーターでEditTextsに入力すると、予期しない結果が生じる可能性があります。テスト用のソフトウェアボタンをクリックするのが最適です。
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;
}
});
EditText
メソッドを含むInputConnection
オブジェクトにアクセスするためにdeleteSurroundingText
をオーバーライドすることでそれを実現しました。削除(バックスペース)イベントの検出に役立ちます。私がここで提供したソリューションを見てください: Android-バックスペースをキャプチャできない/ソフトでキーボードを押して削除できない
このソリューションは、hardKeyboardとsoftKeyboardの両方で正しく機能します。