2017-12-15 15 views
2

私はアクティビティのあるアプリを持っています。このアクティビティにはEditTextフィールドがあります。このフィールドには、アクティビティメソッドのユーザ名がロードされます。onStart()EditText:ユーザー入力の変更と負荷データの変更の検出

ユーザは自分の名前を編集し、次のアクティビティに移動できます。ユーザーが実際に変更を行ったかどうかを検出して、変更を保存するように促す必要があります。

たとえば、ユーザー名が「Sam Jones」であり、彼はそれを編集しないので、私は彼に保存を促したくありません。しかし、もし彼がそれをちょうど "サム"に変えたら、私は彼に促したい。

このEditTextフィールドにTextWatcherを追加しました。ブール値フラグ 'MADE_CHANGES'を作成しました。このフラグを以下のように変更しています。

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

     } 

ただし、このメソッドはアクティビティのonStartメソッドでも呼び出されています。当然のことながら、EditTextが空のフィールドから "Sam Jones"に変更されているためです。だから私の "保存"プロンプトは、ユーザーが自分の名前を変更していない場合でも表示されます。

onStartによってトリガーされた最初の初めてのデータロードイベントを除外して、EditTextがユーザーによって変更されたかどうかを確認する優れた方法はありますか?

答えて

3

onStart()からテキストを設定する場合、最初のTextWatcher

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

を削除してテキストを設定した後に再度追加します。この方法では、クラスのフィールドをTextWatcherにする必要があります。 onCreateで

private boolean isloaded; 


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

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

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

     } 
    }); 
あなたはフラグを使用することができるように活動を実行開始時
0

は、ONSTARTはその後OnResume起こります
関連する問題