イントロ:私は現在EditText
、クロスワードパズルの入力メソッドを実装しようとしています。ユーザーにはのようなものが表示"____"
されEditText
ます。アンダースコアは欠落している文字を示し、最初に入力された文字が最初のアンダースコアを埋めます。もちろん、パズルの他のセルはすでに解決されている可能性があるため、EditText
テキストはである可能性があります"ST_CKOV_RF_OW"
。このすべての機能は、オーバーライドされたビューのサブクラスである自分の入力ビューにすでにありましたonDraw()
。これはかなりうまく機能しましたが、一部のAndroidバージョンではビューが表示されず、Backキーが入力ルーチンをすり抜けてアクセスできませんでした。
EditText
だから、私はそれを使って、実装して、うまくいくと思いましたがTextWatcher
、正しく動作させることができません。私が今持っているものは機能しています。キーボードを使用して文字を入力できますが、Backspaceが機能していません。もちろん、ユーザーがEditText
その位置に触れると、混乱します。
public void beforeTextChanged(CharSequence s,int start,int count, int after){
et.removeTextChangedListener(textWatcher);
int position = text.indexOf("_");
if(position==-1) onAnswerEntered(et.getText().toString().replace("_", "")); //finished
else {
et.setSelection(et.getText().toString().indexOf("_"));
et.addTextChangedListener(textWatcher);
}
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
et.removeTextChangedListener(textWatcher);
try {
String currentKey = s.toString().substring(start, start+1);
Logger.log("Current Key", currentKey);
int position = text.indexOf("_");
Logger.log("Current Position _ ", position+"");
//replace _ with key
String sbefore=text.substring(0, position);
String safter=text.substring(position+1, text.length());
text=sbefore+currentKey+safter;
int positionNext = text.indexOf("_");
Logger.log("Next Position _ ", positionNext+"");
if(positionNext==-1) onAnswerEntered(et.getText().toString().replace("_","")); //finished
else {
et.setText(text);
et.setSelection(et.getText().toString().indexOf("_"));
et.addTextChangedListener(textWatcher);
}
} catch(IndexOutOfBoundsException ioobe) {
ioobe.printStackTrace();
}
}
も設定しようとしましたOnKeyListener
が、機能しませんEditText
(バックスペースイベントを取得できますが、他には何もありません)
ですから、私は完全に間違った方向に進んでいるのかもしれませんが、私を助けて、私がどのように私の目標を達成できるかについての手がかりを与えてください。ありがとう。