0

在性能和优化方面对整个项目使用通用的通用文本观察器有多好?在我的项目中,我使用了许多编辑文本,每个编辑文本都有要实现的侦听器。我创建了一个像这样的通用文本观察器。由于在每个侦听器中我需要访问屏幕的其他视图,我在构造函数中传递这些视图。虽然下面的方法提高了代码的可读性,但它确实引入了强制转换开销。遵循这种方法?有没有更好的方法我可以遵循?-

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

2 回答 2

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)

于 2016-10-30T19:07:53.420 回答
0

您的代码将正常工作。但是,如果您想要最佳实践,我建议您发布/订阅

例如来自 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));
}
于 2016-10-30T19:02:04.893 回答