首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >公共TextWatcher类

公共TextWatcher类
EN

Stack Overflow用户
提问于 2016-07-30 23:12:10
回答 2查看 877关注 0票数 1

我有8个片段,每个片段都扩展了一个布局,其中包括一个包装在TextInputLayout中的EditText。在onCreateView中,我实现了

代码语言:javascript
复制
EditText inputTextFrag1 = (EditText)findViewById(R.id.et_frag1);
inputTextFrag1.addTextChangedListener(new MyTextWatcher(inputTextFrag1));

我还必须在每个片段主体中实现MyTextWatcher类,如下所示:

代码语言:javascript
复制
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();

代码语言:javascript
复制
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次。谢谢

这是在BaseDialogFragment中放置TextWatcher类的正确方式吗?

代码语言:javascript
复制
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方法的逻辑是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-31 00:48:07

您可以创建一个BaseFragment,它将由您的片段扩展。

因此,您可以在此BaseFragment中管理您的TextWatcher,因此具有此传统的片段将接收您期望的逻辑。

如下例所示:

BaseFragment.class

代码语言:javascript
复制
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

代码语言:javascript
复制
public class YourFragment extends BaseFragment {
   ...
}
票数 0
EN

Stack Overflow用户

发布于 2016-07-31 01:15:33

不需要重复。在您当前的实现中,您的MyTextWatcher类似乎是另一个类(可能是片段类)的inner class。在这种实现方式下,您不能在所有片段类之间共享它。

但是,如果将MyTextWatcher类定义为独立类,则可以将其用于所有片段类。为此,您应该只使用在所定义的类的作用域中声明的变量和类成员。在这种情况下,saveButton变量不属于MyTextWatcher类(它可以从外部作用域访问),在这种情况下,您应该通过构造函数方法导入它们。

代码语言:javascript
复制
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的解决方案更好(即使用基片段类)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38675429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档