web-dev-qa-db-ja.com

android edittext onchangeリスナー

TextWatcherについては少し知っていますが、入力したすべての文字で起動します。ユーザーが編集を終了するたびに起動するリスナーが必要です。出来ますか?また、TextWatcherEditableのインスタンスを取得しますが、EditTextのインスタンスが必要です。どうやって手に入れますか?

EDIT:2番目の質問の方が重要です。答えてください。

98
prongs

最初に、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) {}
        });
    }
}

上記のサンプルにはいくつかのエラーが含まれている可能性がありますが、例を示したいだけです。

191
Cata

ButterKnifeを使用している人。次のように使用できます:

@OnTextChanged(R.id.Zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {

}
12
Prakash

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

});
6
Xar E Ahmer
 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);  

    }  
});  
3
Ramesh sambu

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を使用して個々のアイテムを取得できます。そして、最新の値を提供します。

2
user2566490

私がそれについて考えることができる限り、あなたがそれをすることができる2つの方法だけがあります。ユーザーが単語を書き終えたことをどうやって知ることができますか?フォーカスが失われたか、「OK」ボタンをクリックします。ユーザーが最後のキャラクターを押したことを知ることができる方法はありません...

したがって、onFocusChange(View v, boolean hasFocus)を呼び出すか、ボタンとクリックリスナーを追加します。

1
Nuno Gonçalves