私は少し知っていますTextWatcher
が、それはあなたが入るすべてのキャラクターに発砲します。ユーザーが編集を終了するたびに起動するリスナーが必要です。出来ますか?またTextWatcher
、のインスタンスを取得しますが、のインスタンスEditable
が必要ですEditText
。どうすれば入手できますか?
編集:2番目の質問はより重要です。答えてください。
私は少し知っていますTextWatcher
が、それはあなたが入るすべてのキャラクターに発砲します。ユーザーが編集を終了するたびに起動するリスナーが必要です。出来ますか?またTextWatcher
、のインスタンスを取得しますが、のインスタンスEditable
が必要ですEditText
。どうすれば入手できますか?
編集:2番目の質問はより重要です。答えてください。
回答:
まず、ユーザーEditText
がフォーカスを失った場合、またはユーザーが完了ボタンを押した場合にユーザーがテキストの編集を終了したかどうかを確認できます(これは、実装と最適なものによって異なります)。次に、をインスタンスオブジェクトとして宣言した場合EditText
にTextWatcher
のみ、内でインスタンスを取得できませんEditText
。安全ではないため、EditText
内を編集しないでくださいTextWatcher
。
編集:
取得できるようにするにはEditText
、あなたの中にインスタンスをTextWatcher
実装、あなたはこのような何かを試してみてください。
public class YourClass extends Activity {
private EditText yourEditText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
yourEditText = (EditText) findViewById(R.id.yourEditTextId);
yourEditText.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
// you can call or do what you want with your EditText here
// yourEditText...
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
}
}
上記のサンプルにはエラーが含まれている可能性がありますが、ここでは例を示します。
EditTextのすべてのフィールドにリスナーを実装するには、醜い、冗長なコードが必要なため、以下のクラスを作成しました。これに遭遇した人には役立つかもしれません。
public abstract class TextChangedListener<T> implements TextWatcher {
private T target;
public TextChangedListener(T target) {
this.target = target;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
this.onTextChanged(target, s);
}
public abstract void onTextChanged(T target, Editable s);
}
リスナーの実装は少しクリーンになりました。
editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
@Override
public void onTextChanged(EditText target, Editable s) {
//Do stuff
}
});
どれくらいの頻度で起動するかについては//Do stuff
、特定の指定された後に目的のコードを実行するためのチェックを実装できます
私はそれを使ってそれをしましたAutotextView
:
AutotextView textView = (AutotextView) findViewById(R.id.autotextview);
textView.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
seq = cs;
}
@Override
public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
}
@Override
public void afterTextChanged(Editable arg0) {
new SearchTask().execute(seq.toString().trim());
}
});
myTextBox.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {
TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox);
myOutputBox.setText(s);
}
});
TextWatcher
それはすべてのために発砲し続けEditText
、お互いの値をめちゃくちゃにしたので私にとってはうまくいきませんでした。
これが私の解決策です:
public class ConsultantTSView extends Activity {
.....
//Submit is called when I push submit button.
//I wanted to retrieve all EditText(tsHours) values in my HoursList
public void submit(View view){
ListView TSDateListView = (ListView) findViewById(R.id.hoursList);
String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString();
}
}
したがって、getChildAt(xx)
メソッドを使用すると、内の任意のアイテムを取得し、ListView
を使用して個々のアイテムを取得できますfindViewById
。そして、それは最新の値を与えます。
Watcherメソッドは、すべての文字入力で発生します。それで、私はonFocusChangeメソッドに基づいてこのコードを構築しました:
public static boolean comS(String s1,String s2){
if (s1.length()==s2.length()){
int l=s1.length();
for (int i=0;i<l;i++){
if (s1.charAt(i)!=s2.charAt(i))return false;
}
return true;
}
return false;
}
public void onChange(final EditText EdTe, final Runnable FRun){
class finalS{String s="";}
final finalS dat=new finalS();
EdTe.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {dat.s=""+EdTe.getText();}
else if (!comS(dat.s,""+EdTe.getText())){(new Handler()).post(FRun);}
}
});
}
使用するには、次のように呼び出します。
onChange(YourEditText, new Runnable(){public void run(){
// V V YOUR WORK HERE
}}
);
!comS(dat.s、 "" + EdTe.getText())を!equal関数に置き換えることで、comS関数を無視できます。ただし、equal関数自体が実行時に正しく機能しない場合があります。
onChangeリスナーは、ユーザーがフォーカスを入力するとEditTextの古いデータを記憶し、ユーザーがフォーカスを失うか、他の入力にジャンプすると、新しいデータを比較します。古い文字列を同じではない新しい文字列と比較すると、作業が開始されます。
EditTextが1つしかない場合は、Ultimate Secret Transparent Micro EditTextをウィンドウの外に作成してClearFocus関数を作成し、それにフォーカスを要求してから、Import Method Managerを介してキーボードを非表示にする必要があります。