android edittext onchange dinleyici


116

Hakkında biraz bilgim var TextWatcherama bu girdiğiniz her karakterde ateşleniyor. Kullanıcı düzenlemeyi her bitirdiğinde tetiklenen bir dinleyici istiyorum. Mümkün mü? Ayrıca içinde TextWatcherbir örnek Editablealıyorum ama bir örneğine ihtiyacım var EditText. Bunu nasıl elde ederim?

DÜZENLEME : ikinci soru daha önemlidir. Lütfen cevaplayın.


1
odak dinleyiciyi eklemeye çalışın, editText odak aldığında, bu, kullanıcının düzenlemeye başladığı anlamına gelir ve editText odağı kaybettiğinde, düzenleme bitmiş demektir
Houcine

Yanıtlar:


216

İlk olarak, EditTextodak kaybı olursa kullanıcının metni düzenlemeyi bitirip bitirmediğini veya kullanıcının tamam düğmesine basıp basmadığını görebilirsiniz (bu, uygulamanıza ve sizin için neyin en uygun olduğuna bağlıdır). İkinci olarak, bir örnek nesnesi olarak bildirdiyseniz, yalnızca EditTextiçinde bir örnek TextWatcheralamazsınız EditText. Düzenlemek olmamalıdır rağmen EditTextiçinde TextWatchergüvenli olmadığı için.

DÜZENLE:

Elde edebilmek için EditTextsenin içine örneğini TextWatcheruygulanması, böyle bir şey denemelisiniz:

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

Yukarıdaki örnekte bazı hatalar olabileceğini unutmayın, ancak size bir örnek göstermek istedim.


18

Tüm EditText alanlarım için bir dinleyici uygulamak beni çirkin, ayrıntılı bir koda sahip olmamı gerektirdiğinden, aşağıdaki sınıfı yazdım. Bu konuda tökezleyen herkes için faydalı olabilir.

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

Şimdi bir dinleyici uygulamak biraz daha temiz.

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
            @Override
            public void onTextChanged(EditText target, Editable s) {
                //Do stuff
            }
        });

Ne sıklıkla ateşlendiğine gelince, bir kişi istenen kodu //Do stuffbelirli bir koddan sonra çalıştırmak için bir kontrol uygulayabilir.


Bu benim için çok iyi çalışıyor, çok sayıda kod satırı kaydediyor! Sen dahisin!
huypham99

12

ButterKnife kullanan herkes . Gibi kullanabilirsiniz:

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

}

6

Bunu kullanarak yaptım 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
Sonunda bir tane gereksiz} var
Howard

2

TextWatcherher EditTextbiri için ateş etmeye ve birbirlerinin değerlerini bozmaya devam ettiği için benim için çalışmadı

İşte benim çözümüm:

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

Bu nedenle, getChildAt(xx)yöntemi kullanarak içindeki herhangi bir öğeyi ListViewalabilir ve kullanarak tek tek öğeyi alabilirsiniz findViewById. Ve daha sonra en son değeri verecektir.


1

Düşünebildiğim kadarıyla bunu yapmanın sadece iki yolu var. Kullanıcının bir kelimeyi yazmayı bitirdiğini nasıl bilebilirsin? Ya odak kaybolduğunda ya da "tamam" düğmesine tıklandığında. Aklımda kullanıcının son karaktere bastığını bilmenin bir yolu yok ...

Bu nedenle, onFocusChange(View v, boolean hasFocus)bir düğme ve ona bir tıklama dinleyicisi arayın veya ekleyin.


0

Gözcü yöntemi her karakter girdisinde tetiklenir. Ben de bu kodu onFocusChange yöntemine göre oluşturdum:

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

Kullanmak için şu şekilde arayın:

onChange(YourEditText, new Runnable(){public void run(){
    // V  V    YOUR WORK HERE

    }}
);

ComS işlevini! ComS (dat.s, "" + EdTe.getText ())! Equ işleviyle değiştirerek yok sayabilirsiniz. Ancak, eşit işlevin kendisi bir süre çalışma zamanında doğru çalışmaz.

OnChange dinleyicisi, kullanıcı yazmaya odaklandığında EditText'in eski verilerini hatırlayacak ve ardından kullanıcı odağını kaybettiğinde veya başka bir girdiye atladığında yeni verileri karşılaştıracaktır. Eski String karşılaştırılırsa aynı yeni String değil, işi başlatır.

Yalnızca 1 EditText'iniz varsa, o zaman u pencerelerin dışında bir Ultimate Secret Transparan Mikro Düzenleme Metni yaparak bir ClearFocus işlevi yapmanız ve ona odaklanma talebinde bulunmanız, ardından İçe Aktarma Yöntemi Yöneticisi aracılığıyla klavyeyi gizlemeniz gerekecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.