Ich möchte die TextWatcher
Schnittstelle für mehr als ein EditText
Feld implementieren . Zur Zeit benutze ich:
text1.addTextChangedListener(this);
text2.addTextChangedListener(this);
Überschreiben Sie dann die Methoden in meiner Aktivität:
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)
{
// do some operation on text of text1 field
// do some operation on text of text2 field
}
Dies funktioniert zwar einwandfrei, aber ich suche nach anderen Möglichkeiten, damit ich explizit feststellen kann, auf welches EditText
Gebiet sich das SoftKeyboard
derzeit konzentriert.
android
interface
android-activity
android-edittext
textwatcher
Vikas Patidar
quelle
quelle
Antworten:
Die vorgeschlagene Lösung in der Antwort von @Sebastian Roth ist
TextWatcher
für einige kein BeispielEditTexts
. Es ist eine Klasse und n Instanzen dieser Klasse für nEditTexts
.Jeder EditText hat seinen eigenen Spannable.
TextWatcher
Die Ereignisse von 'haben diesen Spannable alss
Parameter. Ich überprüfe ihren Hashcode (eindeutige ID jedes Objekts). myEditText1.getText () gibt diesen Spannable zurück. Also, wenn dasmyEditText1.getText().hashCode()
gleich ists.hashCode()
, bedeutet das, dass zus
gehörtmyEditText1
Wenn Sie also
TextWatcher
für einige eine Instanz haben möchten,EditTexts
sollten Sie Folgendes verwenden:private TextWatcher generalTextWatcher = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (myEditText1.getText().hashCode() == s.hashCode()) { myEditText1_onTextChanged(s, start, before, count); } else if (myEditText2.getText().hashCode() == s.hashCode()) { myEditText2_onTextChanged(s, start, before, count); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { if (myEditText1.getText().hashCode() == s.hashCode()) { myEditText1_beforeTextChanged(s, start, count, after); } else if (myEditText2.getText().hashCode() == s.hashCode()) { myEditText2_beforeTextChanged(s, start, count, after); } } @Override public void afterTextChanged(Editable s) { if (myEditText1.getText().hashCode() == s.hashCode()) { myEditText1_afterTextChanged(s); } else if (myEditText2.getText().hashCode() == s.hashCode()) { myEditText2_afterTextChanged(s); } } };
und
myEditText1.addTextChangedListener(generalTextWatcher); myEditText2.addTextChangedListener(generalTextWatcher);
quelle
TextWatcher
Ereignisse hat diese Spannable alsCharSequence
oderEditable
Parameter. Ich überprüfe den Textwert von EditTexts nicht. Ich überprüfe ihren Hashcode (eindeutige ID jedes Objekts).myEditText1.getText()
GibtSpannable
nicht den Textwert zurück. Also, wenn dasmyEditText1.getText().hashCode()
gleich mits.hashCode()
bedeutet, dass s zu gehörtmyEditText1
Ich würde es so machen:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); EditText e = new EditText(this); e.addTextChangedListener(new CustomTextWatcher(e)); } private class CustomTextWatcher implements TextWatcher { private EditText mEditText; public CustomTextWatcher(EditText e) { mEditText = e; } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { } public void afterTextChanged(Editable s) { } }
quelle
Single TextWatcher for multiple EditTexts
. Es sind 3 Instanzen einer TextWatcher-Klasse. 3 separate TextWatcher steuern also 3 EditTexts.Ich benutze diese Lösung:
Methode hinzufügen, die den Listener zurückgibt:
private TextWatcher getTextWatcher(final EditText editText) { return new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { // do what you want with your EditText editText.setText("blabla"); } @Override public void afterTextChanged(Editable editable) { } }; }
Fügen Sie Listener zu mehreren EditText's hinzu, Sie können auch andere Parameter übergeben:
editText1.addTextChangedListener(getTextWatcher(editText1)); editText2.addTextChangedListener(getTextWatcher(editText2)); editText3.addTextChangedListener(getTextWatcher(editText3));
quelle
Mit der Idee "CustomTextWatcher" habe ich das gemacht
1) Eine neue TextWatcherListener-Schnittstelle erstellt:
public interface TextWatcherExtendedListener extends NoCopySpan { public void afterTextChanged(View v, Editable s); public void onTextChanged(View v, CharSequence s, int start, int before, int count); public void beforeTextChanged(View v, CharSequence s, int start, int count, int after); }
2) Erstellt und verwendet EditTextExtended anstelle von EditText (in meinem Fall):
public class EditTextExtended extends EditText { private TextWatcherExtendedListener mListeners = null; public EditTextExtended(Context context) { super(context); } public EditTextExtended(Context context, AttributeSet attrs) { super(context, attrs); } public EditTextExtended(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void addTextChangedListener(TextWatcherExtendedListener watcher) { if (mListeners == null) { mListeners = watcher; } } public void removeTextChangedListener(TextWatcherExtendedListener watcher) { if (mListeners != null) { mListeners = null; } } void sendBeforeTextChanged(CharSequence text, int start, int before, int after) { if (mListeners != null) { mListeners.beforeTextChanged(this, text, start, before, after); } } void sendOnTextChanged(CharSequence text, int start, int before,int after) { if (mListeners != null) { mListeners.onTextChanged(this, text, start, before, after); } } void sendAfterTextChanged(Editable text) { if (mListeners != null) { mListeners.afterTextChanged(this, text); } } }
3) Also, wo Sie diesen Code schreiben müssen:
myEditTextExtended.addTextChangedListener(this) //Let implement TextWatcherExtendedListener methods
4) benutze sie:
@Override public void onTextChanged(View v, CharSequence s, int start, int before, int count) { //Tested and works //do your stuff } @Override public void beforeTextChanged(View v, CharSequence s, int start, int count, int after) { //not yet tested but it should work } @Override public void afterTextChanged(View v, Editable s) { //not yet tested but it should work }
Lassen Sie mich wissen, was Sie denken.
quelle
--BEARBEITEN--
Wenn Sie nur afterTextChanged verwenden möchten, vergleichen Sie die bearbeitbaren Dateien:
@Override public void afterTextChanged(Editable editable) { if (editable == mEditText1.getEditableText()) { // DO STH } else if (editable == mEditText2.getEditableText()) { // DO STH } }
quelle
hashCode()
desEditable
.Eine weitere Möglichkeit ist um hinzuzufügen ,
OnClickListener
zuEditText
und eine globale Variable gesetzt , wie unten angegebenEditText etCurrentEditor;//Global variable @Override public void onClick(View v) { // TODO Auto-generated method stub if(v instanceof EditText){ etCurrentEditor=(EditText)v; } }
Verwenden Sie diesen etCurrentEditor als Referenz auf den aktuell bearbeiteten EditText
@Override public void afterTextChanged(Editable editable) { // TODO Auto-generated method stub switch (etCurrentEditor.getId()) { case R.id.EDITTEXTID: break; default: break; } }
quelle
Ich habe es implementiert als:
edittext1.addTextChangedListener(this); edittext2.addTextChangedListener(this); edittext3.addTextChangedListener(this);
und:
@Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { if(edittext1.hasFocus()){ //text changed for edittext1 }else if(edittext2.hasFocus()){ //text changed for edittext2 }else { //text changed for edittext3 } } @Override public void afterTextChanged(Editable editable) { }
quelle
Nachdem ich verschiedene Wege ausprobiert habe, um dies zu erreichen, finde ich den richtigen Weg,
EditText.isFocused()
um voneinander zu unterscheiden. Zum Beispiel:private class OnTextChangedListener implements TextWatcher { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { if (edtName.isFocused()) { //do something } else if (edtEmail.isFocused()) { //do something } else if (edtContent.isFocused()) { //do something } } }
quelle
Ja, Sie können mehrere Instanzen eines benutzerdefinierten Benutzers verwenden
TextWatcher
, in denen das gespeichert istTextView
. (TextView
Ist eigentlich die Klasse, die hataddTextChangedListener
.)Ähnlich wie bei der obigen hashCode-Lösung können Sie nur überprüfen, ob
getText()==s
. Anstatt alle Ihre Steuerelemente zu speichern oderfindViewById
mehrmals, können Sie den Inhaltsbaum einfach einmal selbst nach dem Steuerelement durchsuchen, das über das Steuerelement verfügtCharSequence
.public TextView findTextView(View v, CharSequence s) { TextView tv; ViewGroup vg; int i, n; if (v instanceof TextView) { tv = (TextView) v; if (tv.getText()==s) return(tv); } else if (v instanceof ViewGroup) { vg = (ViewGroup) v; n = vg.getChildCount(); for(i=0;i<n;i++) { tv = findTextView(vg.getChildAt(i), s); if (tv!=null) return(tv); } } return(null); } public void afterTextChanged(Editable s) { TextView tv=findTextView(findViewById(android.R.id.content), s); if (tv==null) return; switch(tv.getId()) { case R.id.path: break; case R.id.title: break; } }
Natürlich können Sie auch
findTextView
innenbeforeTextChanged
und verwendenonTextChanged
.quelle
findViewById(android.R.id.content)
ist ein bisschen übertrieben, es bringt dir das,ViewGroup
was deinen Inhalt enthält. Es ist besser, den niedrigsten Wert auszuwählen,ViewGroup
der alle interessanten Informationen enthält, die den Text ändern.Global Eine Klasse für alle Aktivitäten.
CustomTextWatcher.java
package org.logicbridge.freshclub.customizedItems; import android.content.Context; import android.text.Editable; import android.text.TextWatcher; public class CustomTextWatcher implements TextWatcher { private EditText mEditText; Context context; public CustomTextWatcher(EditText e, Context context) { mEditText = e; this.context = context; } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { } public void afterTextChanged(Editable s) { } }
quelle
Sie können dies tun, um die ID der Bearbeitungstexte abzurufen. Es ist nicht getestet, aber lassen Sie mich wissen, ob es funktioniert.
//setting textWatcher for the editText textWatcher(owner_name); public void textWatcher(final EditText editText){ TextWatcher watcher = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if(editText.getId()==R.id.your_id){ //Do something } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { if(editText.getId()==R.id.your_id){ //Do something } } @Override public void afterTextChanged(Editable s) { } }; editText.addTextChangedListener(watcher); }
quelle
Sie können jederzeit
TextWatcher
einen Parameter für dieaddTextChangedListener
Methode definieren. Auf diese Weise können Sie für jeden Bearbeitungstext mehrere Definitionen festlegen .quelle
Vergleichen Sie einfach die Hash-Codes von edittext und string wie mit der hashCode () -Methode
@Override public void afterTextChanged(Editable s) { if (editext.getText().hashCode() == s.hashCode()){ type1Total(type1List); } }
quelle
Das habe ich getan ...
private TextWatcher textWatcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (editText1.getText().length() > 0 && editText2.getText().length() > 0 && editText3.getText().length() > 0) { button.setEnabled(true); } else { button.setEnabled(false); } } @Override public void afterTextChanged(Editable s) { }
Fügen Sie dann einfach den TextWatcher zu jedem EditText in der onCreate-Methode hinzu und behalten Sie hier standardmäßig die Schaltfläche setEnabled (false) bei.
button.setEnabled(false); editText1.addTextChangedListener(textWatcher); editText2.addTextChangedListener(textWatcher); editText3.addTextChangedListener(textWatcher);
quelle
Wenn Sie Kotlin verwenden, erledigt die Erweiterungsfunktion die Aufgabe. Zum Beispiel müssen wir TextWatcher zu
editText1
und hinzufügeneditText2
Erstellen Sie eine Erweiterungsfunktion wie folgt:
fun EditText.addTextWatcher() { this.addTextChangedListener( object : TextWatcher { override fun afterTextChanged(s: Editable?) { } override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { // you do some common operations here when (this@addTextWatcher) { editText1 -> { // do something for editText1 } editText2 -> { // do something for editText2 } } } } ) }
Fügen Sie dann einfach den Textwatcher wie folgt zu EditTexts hinzu
editText1.addTextWatcher() editText2.addTextWatcher()
quelle