2016-07-30 60 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个片段。

不过,@布鲁诺维埃拉的解决方案更好(即使用基本片段类)。