问题
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.
回答1:
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.
回答2:
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());
}
}
回答3:
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
回答4:
this solution also prevents a touch and drag, apart from click
//don't allow user to move cursor
editText.setOnTouchListener { view, motionEvent ->
if (motionEvent.action == MotionEvent.ACTION_UP) {
editText.setSelection(editText.text.length)
}
return@setOnTouchListener true
}
回答5:
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.
来源:https://stackoverflow.com/questions/7786720/android-edittext-how-to-disable-cursor-move-on-touch