I have EditText which displays something like ###-###. I want the user to be able to change this text only from the 1st position onward. That is user should not be able to touch a # in the middle and change it. How can I do this? Thanks a lot.
Sorry, I was not precise in my question. I want to disable even tapping in the middle of the text.
Following code will force the curser to stay in last position if the user tries to move it with a tap on the edittext:
edittext.setCursorVisible(false);
edittext.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
edittext.setSelection(edittext.getText().length());
}
});
Note that the user can still change the position of the curser via arrow keys and / or trackball. As far as I know there is currently no workaround for this issue.
try creating a class the derives from edittext and override onSelectionChanged for example
public class BlockedSelectionEditText extends
EditText{
/** Standard Constructors */
public BlockedSelectionEditText (Context context) {
super(context);
}
public BlockedSelectionEditText (Context context,
AttributeSet attrs) {
super(context, attrs);
}
public BlockedSelectionEditText (Context context,
AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onSelectionChanged(int selStart, int selEnd) {
//on selection move cursor to end of text
setSelection(this.length());
}
}
public class MyEditText extends EditText{
@Override
public boolean onTouchEvent(MotionEvent event)
{
final int eventX = event.getX();
final int eventY = event.getY();
if( (eventX,eventY) is in the middle of your editText)
{
return false;
}
return true;
}
}
This will "disable" tapping in the middle of your edit text
You need to implement the TextWatcher interface and override the three methods, afterTextChanged, beforeTextChanged, onTextChanged (you may only need to actually use one of them) Eg:
public class MyTextWatcher implements TextWatcher {
@Override
public void afterTextChanged(Editable arg0) {
changeItBack();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
}
You then add this Watcher to your EditText, like so:
myEditText.addTextChangedListener(new MyTextWatcher());
Hope this helps.