2016-07-30 12 views
0

Ich habe 8 Fragmente, die jeweils ein Layout mit einem EditText auffüllen, der in einem TextInputLayout eingeschlossen ist. Im onCreateView, ist die UmsetzungGemeinsame TextWatcher-Klasse

EditText inputTextFrag1 = (EditText)findViewById(R.id.et_frag1); 
inputTextFrag1.addTextChangedListener(new MyTextWatcher(inputTextFrag1)); 

Am auch unter MyTextWatcher Klasse in jedem Fragment Körper zu implementieren, mit:

private class MyTextWatcher implements TextWatcher { 

      private View view; 

      public MyTextWatcher(View view) { 
       this.view = view; 
      } 

      @Override 
      public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
       saveButton.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY); 
       saveButton.setClickable(false); 
      } 

      @Override 
      public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
      } 

      @Override 
      public void afterTextChanged(Editable editable) { 
       saveButton.getBackground().setColorFilter(null); 
       switch (view.getId()) { 
        case R.id.et_frag1: 
         validateName(); 
         break; 
       } 
      } 
     } 

Wo validateName();

private boolean validateName() { 
      if (inputTextFrag1 .getText().toString().trim().isEmpty()) { 
       mInputLayoutName.setError(getString(R.string.err_msg_name)); 
       requestFocus(inputTextFrag1); 
       return false; 
      } else { 
       mInputLayoutName.setErrorEnabled(false); 
      } 
      return true; 
     } 

Gibt es eine Möglichkeit nur eine MyTextWatcher Klasse zu haben irgendwo und ein validateName() -Methode von jedem Fragment aufgerufen werden anstelle der gleichen Klasse/Methode 8 mal zu duplizieren. Danke

Ist dies der richtige Weg, um die TextWatcher-Klasse in einem BaseDialogFragment zu platzieren?

public abstract class BaseDialogFragment extends DialogFragment{ 

    private class MyTextWatcher implements TextWatcher { 

     private View view; 

     public MyTextWatcher(View view) { 
      this.view = view; 
     } 

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

Welche Logik geht in die beforeTextChanged und afterTextChanged Methoden der TextWatcher?

Antwort

0

Sie können eine BaseFragment erstellen, die um Ihre Fragmente erweitert wird.

Daher können Sie Ihre TextWatcher in diesem BaseFragment verwalten und folglich die Fragmente, die dieses Erbe haben, erhalten Ihre erwartete Logik.

Wie im folgenden Beispiel:

BaseFragment.class

public abstract class BaseFragment extends Fragment implements TextWatcher { 

    EditText editText; 
    Button button; 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     //inflate your edit text 
     ... 

     //inflate your button 
     ... 

     editText.addTextChangedListener(this); 

    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     //text watcher listener 
    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     //text watcher listener 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     //text watcher listener 
    } 
} 

YourFragment.class

public class YourFragment extends BaseFragment { 
    ... 
} 
+0

@Geob, warum haben Sie bearbeitet, wenn Sie einen Kommentar abgeben wollten? –

+0

@uoɥʇʎPʎzɐɹC-Sorry, erkannte den Fehler, versuchte zu rückgängig machen, konnte aber nicht – Geob

0

Keine Notwendigkeit für die Vervielfältigung. In Ihrer aktuellen Implementierung scheint Ihre Klasse MyTextWatcher eine inner class einer anderen Klasse (wahrscheinlich Fragmentklasse) zu sein. Bei dieser Art der Implementierung können Sie sie nicht für alle Fragmentklassen freigeben.

Wenn Sie jedoch Ihre MyTextWatcher Klasse als eigenständige Klasse definieren, können Sie sie für alle Fragmentklassen verwenden. Verwenden Sie dazu nur die Variablen und Klassenmember, die im Gültigkeitsbereich der zu definierenden Klasse deklariert wurden. In Ihrem Fall saveButton Variable gehört nicht zu MyTextWatcher Klasse (es ist von der äußeren Geltungsbereich zugänglich), in solchen Fällen sollten Sie sie über die Konstruktormethode importieren.

private class MyTextWatcher implements TextWatcher { 

     private View view; 
     private Button saveButton; 

     public MyTextWatcher(View view, Button saveButton) { 
      this.view = view; 
      this.saveButton = saveButton; 
     } 

     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
      saveButton.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY); 
      saveButton.setClickable(false); 
     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
     } 

     @Override 
     public void afterTextChanged(Editable editable) { 
      saveButton.getBackground().setColorFilter(null); 
      switch (view.getId()) { 
       case R.id.et_frag1: 
        validateName(); 
        break; 
      } 
     } 
    } 

Sie können diese Klasse nun 8 Mal für Ihre 8 Fragmente instanziieren.

Die Lösung von @Bruno Vieira ist jedoch besser (d. H. Mit einer Basisfragmentklasse).