2017-12-15 3 views
2

Ich habe eine App mit einer Aktivität. Diese Aktivität hat ein EditText Feld. Dieses Feld wird mit dem Namen des Benutzers auf der Aktivitätsmethode onStart()EditText: Benutzereingangsänderung im Vergleich zu Lastdatenänderung erkennen

geladen Jetzt kann der Benutzer seinen Namen bearbeiten und zur nächsten Aktivität navigieren. Ich möchte feststellen, ob der Benutzer tatsächlich Änderungen vorgenommen hat oder ihn nicht aufgefordert hat, seine Änderungen zu speichern.

Also zum Beispiel ist der Benutzername "Sam Jones" und er bearbeitet es nicht, ich möchte ihn nicht zum Speichern auffordern. Aber wenn er es nur zu "Sam" ändert, möchte ich ihn auffordern.

Also fügte ich ein TextWatcher zu diesem EditText Feld hinzu. Ich habe ein boolesches Flag 'MADE_CHANGES' erstellt und ändere dieses Flag wie folgt.

TextWatcher textWatcher = 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) { 
      MADE_CHANGES = true; 
     } 

     @Override 
     public void afterTextChanged(Editable editable) { 

     } 

Jedoch ist dieses Verfahren wird auch durch die onStart Methode der Aktivität genannt. Verständlicherweise, da die EditText von einem leeren Feld zu "Sam Jones" geändert wird. Daher wird meine Eingabeaufforderung "Speichern" angezeigt, auch wenn der Benutzer keine Änderungen an seinem Namen vorgenommen hat.

Gibt es eine elegante Lösung, um zu überprüfen, ob der EditText vom Benutzer geändert wurde, während das erste erstmalige Datenladeereignis ausgeschlossen wurde, das von onStart ausgelöst wurde?

Antwort

3

Wenn Sie den Text aus onStart() Einstellung, entfernen Sie zunächst die TextWatcher

if(textWatcher != null){ 
    myEditText.removeTextChangedListener(textWatcher); 
} 

und fügen Sie wieder nach den Text zu setzen. Für diesen Ansatz müssen Sie das TextWatcher ein Feld Ihrer Klasse machen.

0

zu Beginn eine Aktivität ausgeführt wird, geschieht onStart onResume dann, so dass Sie ein Flag verwenden können:

private boolean isloaded; 


@Override 
protected void onResume() { 
    super.onResume(); 
    isloaded=true; 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    isloaded=false; 
} 

In onCreate:

 txt.addTextChangedListener(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) { 
      if (isloaded) 
      MADE_CHANGES = true; 
     } 

     @Override 
     public void afterTextChanged(Editable editable) { 

     } 
    }); 
Verwandte Themen