If you think the Android project Joetz-Android-V2 listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
Java Source Code
package com.example.jens.myapplication.domain.binding;
/*fromwww.java2s.com*/import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import com.example.jens.myapplication.R;
import com.example.jens.myapplication.domain.converter.ErrorConverter;
import com.example.jens.myapplication.domain.validator.Validator;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* A binding to an EditText object that also validates it
*/publicabstractclass ValidatorBinding<T extends Validator>{
protected T validator;
protected EditText view;
protectedint field;
private ValidationTask validationTask;
private String itemName;
privateboolean required;
private LinkedList<View.OnFocusChangeListener> onFocusChangeListeners;
/**
*
* @param validator The validator for this binding
* @param view The view this bindign is bound to
* @param field The field this validator will be validating (implemented in concrete
* implementation of this class as constant usually
* @param itemName The name of the item this binding is bound to (for erorr validation messages)
*/public ValidatorBinding(T validator, EditText view, int field, String itemName){
this(validator, view, field, itemName, true);
}
/**
*
* @param validator The validator for this binding
* @param view The view this bindign is bound to
* @param field The field this validator will be validating (implemented in concrete
* implementation of this class as constant usually
* @param itemName The name of the item this binding is bound to (for erorr validation messages)
* @param required True if the field is required to be filled in
*/public ValidatorBinding(T validator, EditText view, int field, String itemName, boolean required){
this.validator = validator;
this.view = view;
this.field = field;
this.required = required;
this.validationTask = createTask(field);
if(this.validationTask == null){
thrownew IllegalArgumentException("Invalid field ID for binding");
}
this.itemName = itemName;
view.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
publicvoid onFocusChange(View v, boolean hasFocus) {
if(!hasFocus){
setValue(((EditText) v).getText().toString());
validate();
}
if(onFocusChangeListeners != null){
for(View.OnFocusChangeListener listener : onFocusChangeListeners){
listener.onFocusChange(v, hasFocus);
}
}
}
});
view.addTextChangedListener(new TextWatcher() {
@Override
publicvoid beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
publicvoid onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
publicvoid afterTextChanged(Editable s) {
setValue(s.toString());
//validate();
}
});
final EditText fView = view;
view.setOnKeyListener(new View.OnKeyListener() {
@Override
publicboolean onKey(View v, int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_DEL){
setValue(fView.getText().toString());
validate();
}
return false;
}
});
fillValue();
setValue(view.getText().toString());
}
/**
* Validate this field
* @return The list of errors if there were validation errors,
* null if there were no validation errors
*/public List<Integer> validate(){
if(!required && view.getText().toString().isEmpty()){
view.setError(null);
return null;
}
List<Integer> errorIds = new ArrayList<Integer>();
if(required && view.getText().toString().isEmpty()){
errorIds.add(R.string.$_need_filled_in);
}
else{
validationTask.validate(errorIds);
}
view.setError(ErrorConverter.createErrorsString(errorIds, itemName));
if(errorIds.size() < 1){
return null;
}else{
return errorIds;
}
}
/**
* Add a listener that will be called upon when the focus of this binding changes
* @param focusChangeListener The listener object that will be notified of the change
*/publicvoid addOnFocusChangeListener(View.OnFocusChangeListener focusChangeListener){
if(onFocusChangeListeners == null){
onFocusChangeListeners = new LinkedList<View.OnFocusChangeListener>();
}
onFocusChangeListeners.add(focusChangeListener);
}
publicvoid setRequired(boolean required){
this.required = required;
}
publicboolean isRequired() {
return required;
}
/**
*
* @return The view this binding is bound to
*/public EditText getView(){
return view;
}
/**
* Create the task that validates a field
* @param field The field that should be validated
* @return
*/protectedabstract ValidationTask createTask(int field);
/**
* Fill the value of the bound object with the value of the view.
* @param s The value to be inserted
*/protectedabstractvoid setValue(String s);
/**
* Fill the value of the bound View with the value of the object.
*/publicabstractvoid fillValue();
protectedinterface ValidationTask{
public List<Integer> validate(List<Integer> errors);
}
}