对整个项目使用通用的通用 TextWatcher

Using common generic TextWatcher for whole project

就性能和优化而言,对整个项目使用通用的通用文本观察器有多好?在我的项目中,我使用了很多 editext,每个 edittext 都有要实现的监听器。 我在每个侦听器中创建了一个像 this.Since 这样的通用文本观察器 我需要访问屏幕的其他视图 我在 constructor.While 中传递这些视图 下面的方法提高了代码的可读性 它确实引入了转换 overhead.Is 遵循这种方法是一种很好的做法吗?有没有更好的方法可以遵循?-

public class GenericTextWatcher implements TextWatcher {

    private View view,view2,view3,view4;
    public  GenericTextWatcher(View view) {
        this.view = view;
    }
    public GenericTextWatcher(View view,View view2,View view3) {
         this.view = view;
        this.view2=view2;
        this.view3=view3;
     }
    public GenericTextWatcher(View view,View view2) {
        this.view = view;
        this.view2=view2;
    }
    public GenericTextWatcher(View view,View view2,View view3,View view4) {
        this.view = view;
        this.view2=view2;
        this.view3=view3;
        this.view4=view4;
    }

    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        switch (view.getId())
        {
            case R.id.etMfafasf:
                if (((EditText)view).getText().length()==8 &&((EditText)view2).getText().length()>0)
                    ((TextView)view3).setEnabled(true);
                else
                    ((TextView)view3).setEnabled(false);
                break;
            case R.id.etModaDFFSA:
                if (((EditText)view2).getText().length()>0 &&((EditText)view).getText().length()==8)
                    ((TextView)view3).setEnabled(true);
                else
                    ((TextView)view3).setEnabled(false);
               ValidationUtils.checkfasffsfimit(charSequence,(TextInputLayout)view4);
                break;

            case R.id.etMoXYZ:
                if (((EditText)view).getText().length()==8)
                    ((TextView)view2).setEnabled(true);
                else
                    ((TextView)view2).setEnabled(false);
                break;
        }
    }

    public void afterTextChanged(Editable editable) {

    }
}

正在调用 TextWatcher

etNumber.addTextChangedListener(new GenericTextWatcher(etNumber,tvNdf));

您的代码可以正常工作。但如果你想要最佳实践,我建议 publish/subscribe

例如 EventBus 来自 Google Guava 库 - "Publish-subscribe-style communication between components without requiring the components to explicitly register with one another".

这是一个例子,

在您的 activity 或片段中,创建一个事件总线

EventBus eventBus = new EventBus();

注册将侦听(订阅)事件的对象。在这种情况下,它将是您的 activity 或片段

eventBus.register(this);

然后创建一个 class 作为您的活动

public class EditEvent {
     private CharSequence charSequence, int i, int i1, int i2, int id; // add getters and setters
     public EditEvent(CharSequence charSequence, int i, int i1, int i2, int id)
     {//...}
}

然后使用@Subscribe 注释订阅您的 activity 或片段中的事件

@Subscribe // this will be called when an EditEvent is posted to the bus
public void handleTextChange(EditEvent event) {
     switch (event.id)
     {
           //...
     }
}

最后,在每个视图的观察者处,post 事件

onTextChanged(CharSequence s, int start, int before, int count)
{
       eventBus.post(new EditEvent(s, start, before, count, EditText.this));
}

如果你想避免运行时的类型转换成本,我想你可以以更结构化的方式开发它。

public class GenericTextWatcher implements TextWatcher {

    private EditText[] mEditArray;
    private TextView[] mTextArray;

    public  GenericTextWatcher(EditText[] editArray, EditText textArray) {
        mEditArray = editArray;
        mTextArray = textArray;
    }

    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        switch (view.getId())
        {
            case R.id.etMfafasf:

                EditText view= mEditArray[0], view2 = mEditArray[1];

                TextView view3 = mTextArray[0]; 
                if (view.getText().length()==8 && view2.getText().length()>0)
                    view3.setEnabled(true);
                else
                    view3.setEnabled(false);
                break;

            case R.id.etModaDFFSA:
                EditText view= mEditArray[0], view2 = mEditArray[1];

                TextView view3 = mTextArray[0]; 
                if (view2.getText().length()>0 && view.getText().length()==8)
                    view3.setEnabled(true);
                else
                    view3.setEnabled(false);
               ValidationUtils.checkfasffsfimit(charSequence,(TextInputLayout)view4);
                break;

            case R.id.etMoXYZ:
                EditText view= mEditArray[0], view2 = mEditArray[1];

                if (view.getText().length()==8)
                    view2.setEnabled(true);
                else
                    view2.setEnabled(false);
                break;
        }
    }
 }

你可以这样调用分配监听器:

etNumber.addTextChangedListener(
new GenericTextWatcher(new EditText[]{etNumber}, new TextView[]{tvNdf}));

这将使它更清晰,因为您正在根据参数数量重载构造函数...这可能不是最好的设计,因为明天假设您需要一个具有 10 个视图的构造函数,您的重载构造函数将像 GenericTextWatcher(view, view1, view2 ...., view9)

一样增长