2016-07-30 34 views
0

我有8個片段,每個片段都包含一個包含在TextInputLayout中的EditText。在onCreateView,AM實施Common TextWatcher類

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

亦很不必實現在每個片段中的身體如下MyTextWatcher類:

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

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

有一種方法以具有某處僅有一個MyTextWatcher類和一個validateName()方法由每個片段,而不是重複相同的類/方法8次被調用。謝謝

這是將TextWatcher類放在BaseDialogFragment中的正確方法嗎?

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

什麼邏輯進入TextWatcher的beforeTextChanged和afterTextChanged方法?

回答

0

您可以創建一個BaseFragment,它將由您的片段進行擴展。

因此,您可以在此BaseFragment中管理您的TextWatcher,因此具有此遺產的片段將收到您的預期邏輯。

如下面的例子:

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,你爲什麼編輯你想評論? –

+0

@uoɥʇʎPʎzɐɹC-對不起,意識到了這個錯誤,試圖撤消但不能 – Geob

0

無需重複。在你目前的實現中,看起來你的MyTextWatcher類是另一個類(可能是片段類)的inner class。在這種實現方式中,您不能在所有片段類中共享它。

但是,如果您將MyTextWatcher類定義爲獨立類,則可以將其用於所有片段類。要做到這一點,你應該只使用在被定義的類的範圍內聲明的變量和類成員。在你的情況下,saveButton變量不屬於MyTextWatcher類(它可以從外部範圍訪問),在這種情況下,你應該通過構造函數方法導入它們。

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

您現在可以實例化這個類8次爲您8個片段。

不過,@布魯諾維埃拉的解決方案更好(即使用基本片段類)。