android edittext onchangeリスナー


115

私は少し知っていますTextWatcherが、それはあなたが入るすべてのキャラクターに発砲します。ユーザーが編集を終了するたびに起動するリスナーが必要です。出来ますか?またTextWatcher、のインスタンスを取得しますが、のインスタンスEditableが必要ですEditText。どうすれば入手できますか?

編集:2番目の質問はより重要です。答えてください。


1
フォーカスリスナーの追加を試みます。editTextがフォーカスを取得した場合、つまりユーザーが編集を開始したことを意味し、editTextがフォーカスを失った場合は、編集が終了したことを意味します
Houcine

回答:


214

まず、ユーザーEditTextがフォーカスを失った場合、またはユーザーが完了ボタンを押した場合にユーザーがテキストの編集を終了したかどうかを確認できます(これは、実装と最適なものによって異なります)。次に、をインスタンスオブジェクトとして宣言した場合EditTextTextWatcherのみ、内でインスタンスを取得できません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) {}
        });
    }
}

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


17

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、特定の指定された後に目的のコードを実行するためのチェックを実装できます


これは私にとって非常にうまく機能し、多くのコード行を節約します!あなたは天才です!
huypham99

12

バターナイフを使用している。次のように使用できます。

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

}

6

私はそれを使ってそれをしました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());
    }

});

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

    }  
});  

2
最後に1つの不要な}があります
Howard

2

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。そして、それは最新の値を与えます。


1

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

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


0

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を介してキーボードを非表示にする必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.