对整个项目使用通用的通用 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)
一样增长
就性能和优化而言,对整个项目使用通用的通用文本观察器有多好?在我的项目中,我使用了很多 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)
一样增长