Android EditText: How to disable cursor move on to

2019-03-20 06:25发布

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.

4条回答
做自己的国王
2楼-- · 2019-03-20 06:52

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楼-- · 2019-03-20 06:56

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.

查看更多
我命由我不由天
4楼-- · 2019-03-20 07:18

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.

查看更多
Root(大扎)
5楼-- · 2019-03-20 07:19
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

查看更多
登录 后发表回答