使用通用的通用TextWatcher进行整个项目

时间:2016-10-30 18:48:15

标签: android android-edittext android-textwatcher

在性能和优化方面对整个项目使用通用通用textwatcher有多好?在我的项目中,我使用了很多editext,每个edittext都有监听器可以实现。 我创建了一个像这样的通用文本观察器。因为在每个监听器中我需要访问屏幕的其他视图我在构造函数中传递这些视图。虽然下面的方法提高了代码的可读性,但它确实引入了一个转换开销。这是一个很好的做法这种方法?我可以采用更好的方法吗? -

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

2 个答案:

答案 0 :(得分:1)

如果您希望避免运行时的类型转换成本,我认为您可以以更有条理的方式开发此内容。

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)一样增长

答案 1 :(得分:0)

您的代码可以正常运行。但如果您想要最佳做法,我建议publish/subscribe

例如来自Google Guava Library的EventBus - "组件之间的发布 - 订阅式通信,无需组件明确地相互注册"。

这是一个例子,

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

EventBus eventBus = new EventBus();

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

eventBus.register(this);

然后创建一个将成为您事件的类

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注释

订阅活动或片段中的事件
@Subscribe // this will be called when an EditEvent is posted to the bus
public void handleTextChange(EditEvent event) {
     switch (event.id)
     {
           //...
     }
}

最后,在每个观看者的观察者中,发布事件

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