【问题标题】:Common TextWatcher class常见的 TextWatcher 类
【发布时间】:2016-07-30 15:12:09
【问题描述】:

我有 8 个片段,每个片段都使用包含在 TextInputLayout 中的 EditText 来扩展布局。在onCreateView中,正在实现

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

验证名称();

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 方法中的逻辑是什么?

【问题讨论】:

    标签: android validation android-textwatcher


    【解决方案1】:

    您可以创建一个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 {
       ...
    }
    

    【讨论】:

    • @uoɥʇʎPʎzɐɹC-Sorry,意识到错误,试图撤消但无法
    【解决方案2】:

    无需重复。在您当前的实现中,您的 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 次。

    但是,@Bruno Vieira 的解决方案更好(即使用基本片段类)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 2011-07-17
      • 2012-08-27
      • 2021-02-17
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多