EditText에서 커서 위치를 설정하는 방법은 무엇입니까?


235

EditText첫 번째 EditText에 텍스트가 설정된 페이지를로드하는 동안 두 가지 가 있으므로 이제 커서는의 시작 위치에 있습니다. 데이터가없는 두 번째 EditText에서 커서 위치EditText설정 하고 싶습니다 . 이것을하는 방법?


2
중력을 'center'로 설정할 수 있으며 커서가 자동으로 가운데에 설정됩니다. 그러면 텍스트도 중앙에 위치하게됩니다.
Hiral Vadodaria

우선, 수락 비율을 개선하십시오. 둘째, edittext에 텍스트가 없을 때 커서 위치를 설정한다는 것은 무엇을 의미합니까?
Vladimir

답변:


483

위치가 int 인 경우 :

editText1.setSelection(position)

XML 파일 에서이 작업을 수행 할 수있는 방법이 있습니까?
kike

@kike 난 그렇게 생각하지 않아
atasoyh

1
데이터 바인딩과 XML의 선택 : 안드로이드를 사용
무바라크 모 히딘

96

I로 설정 커서 위치에이 방법으로 수행 한 프로그램 글고의 텍스트를 업데이트 한 후 텍스트의 끝 여기를 etmsg글고입니다

etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);

4
아 +1! 편집 텍스트에서 커서 위치를 설정하는 데 도움이되었습니다.
Dharmendra

2
이것은 나를 위해 작동하지 않았습니다. EditText에 Spannable 문자열이 있습니다. 이에 대한 해결 방법이 있습니까?
toobsco42

1
@ toobsco42 안녕하세요, 난 그냥이 확인 .. 글고 치기에 Spannable 문자열을 사용하는 시도 pastebin.com/i02ZrNw4을 그리고 그것이 있어야로 예상대로 작동됩니다 .. 확인 및 비교
MKJParekh

xml 파일에서 가능합니까? @MKJParekh
Yog Guru

1
같은 일을하는 것 같습니다 :etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
Steve Blackwell 9

37

Android에서 EditText 커서 위치를 설정하는 방법

아래 코드는 커서를 시작 위치설정합니다EditText .

 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(0);

아래 코드는 커서를 다음 끝 으로 설정 합니다 EditText.

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());

아래 코드는 두 번째 문자 위치 뒤의 커서 설정입니다.

 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(2);

17

데이터가없는 edittext에서 커서 위치를 설정하고 싶습니다

빈 EditText에는 위치가 하나뿐입니다 setSelection(0).

아니면 EditText활동이 시작될 때 집중하고 싶 습니까? 이 경우 requestFocus()


setSelection (0)이 작동하지 않습니다. 두 번째 EditText에 초점을 맞추고 싶지 않습니다. 두 번째 EditText에만 커서를 설정하고 싶습니다
nila

3
올바르게 기억하면 EditText가 포커스를 요청할 때 커서가 설정됩니다. 이것을 읽으십시오
Reno

12

아래 줄을 사용하십시오

e2.setSelection(e2.length());

e2 편집 텍스트입니다. Object Name


9

editText2를 두 번째 EditText 뷰라고 가정하고 다음 코드 조각을 onResume () 에 넣습니다.

editText2.setFocusableInTouchMode(true);
editText2.requestFocus();

또는 넣어

<requestFocus />

두 번째 EditText보기의 XML 레이아웃에서.


7

언젠가 편집 텍스트 커서가 특정 위치에 오지 않으면 직접 사용하는 것 editText.setSelection(position);입니다. 이 경우 시도해 볼 수 있습니다

editText.post(new Runnable() {
                @Override
                public void run() {
                    editText.setSelection(string.length());
                }
            });

7

EditText의 특정 위치에 커서를 놓으려면 다음을 사용할 수 있습니다.

yourEditText.setSelection(position);

또한 프로그래밍 방식으로 일부 텍스트를 다음과 같이 선택할 수 있도록 초기 및 최종 위치를 설정할 수 있습니다.

yourEditText.setSelection(startPosition, endPosition);

커서를 배치 할 수 있기 때문에 선택을 설정하는 것은 까다로운 일이 될 수 있음을 유의하시기 바랍니다 이나 후에 문자, 이미지 아래의 방법이 경우 인덱스 작품 설명 :

여기에 이미지 설명을 입력하십시오

따라서 텍스트 끝에 커서를 원하면로 설정하십시오 yourEditText.length().


5

setSelection(int index)방법을 Edittext사용하면이 작업을 수행 할 수 있습니다.


4

알림 : edittext.setSelection()커서 alertdialog설정에 사용 selection()중이고 예를 들어 설정하는 동안 커서가 작동하지 않는 경우 대화 상자가 작성된 후 설정해야합니다.

예:

AlertDialog dialog = builder.show();
input.setSelection(x,y);

3

이 코드는 텍스트 편집의 마지막 위치에 커서를 표시하는 데 도움이됩니다.

 editText.requestFocus();
 editText.setSelection(editText.length());

2

편집 텍스트를 요청 requestFocus()하기 전에 전화하십시오 setSelection.


1

setSelection () 메소드를 직접 얻지 않으므로 아래처럼하고 매력처럼 작동합니다.

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setText("Updated New Text");
int position = editText.getText().length();
Editable editObj= editText.getText();
Selection.setSelection(editObj, position);

1

n문자 다음에 커서 를 오른쪽에서 왼쪽 으로 설정하려면 다음과 같이해야합니다.

edittext.setSelection(edittext.length()-n);

edittext의 텍스트가

version<sub></sub>

오른쪽에서 6 번째 위치로 커서를 이동하려고합니다.

그런 다음 커서를

    version<sub> </sub>
                ^


1
if(myEditText.isSelected){
    myEditText.setSelection(myEditText.length())
    }

0

커서를 행과 열로 설정

다음 코드를 사용하여 EditText에서 특정 행과 열에 해당하는 위치를 얻을 수 있습니다. 그런 다음 editText.setSelection(getIndexFromPos(row, column))커서 위치를 설정하는 데 사용할 수 있습니다 . 메소드를 다음과 같이 호출 할 수 있습니다.

  • getIndexFromPos(x, y) x 행의 y 열로 이동
  • getIndexFromPos(x, -1) x 행의 마지막 열로 이동
  • getIndexFromPos(-1, y) 마지막 줄의 y 열로 이동
  • getIndexFromPos(-1, -1) 마지막 줄의 마지막 열로 이동

모든 행 및 열 경계가 처리됩니다. 줄 길이보다 큰 열을 입력하면 줄의 마지막 열 위치가 반환됩니다. EditText의 줄 수보다 큰 줄을 입력하면 마지막 줄로 이동합니다. 많이 테스트되었으므로 충분히 신뢰할 수 있어야합니다.

static final String LINE_SEPARATOR = System.getProperty("line.separator");

int getIndexFromPos(int line, int column) {
    int lineCount = getTrueLineCount();
    if (line < 0) line = getLayout().getLineForOffset(getSelectionStart());  // No line, take current line
    if (line >= lineCount) line = lineCount - 1;  // Line out of bounds, take last line

    String content = getText().toString() + LINE_SEPARATOR;
    int currentLine = 0;
    for (int i = 0; i < content.length(); i++) {
        if (currentLine == line) {
            int lineLength = content.substring(i, content.length()).indexOf(LINE_SEPARATOR);
            if (column < 0 || column > lineLength) return i + lineLength;  // No column or column out of bounds, take last column
            else return i + column;
        }
        if (String.valueOf(content.charAt(i)).equals(LINE_SEPARATOR)) currentLine++;
    }
    return -1;  // Should not happen
}

// Fast alternative to StringUtils.countMatches(getText().toString(), LINE_SEPARATOR) + 1
public int getTrueLineCount() {
    int count;
    String text = getText().toString();
    StringReader sr = new StringReader(text);
    LineNumberReader lnr = new LineNumberReader(sr);
    try {
        lnr.skip(Long.MAX_VALUE);
        count = lnr.getLineNumber() + 1;
    } catch (IOException e) {
        count = 0;  // Should not happen
    }
    sr.close();
    return count;
}

질문은 이미 답변되었지만 누군가가 대신 할 수 있다고 생각했습니다.

각 문자를 반복하여 행 구분 기호를 찾을 때마다 행 수를 증가시켜 작동합니다. 행 수가 원하는 행과 같으면 현재 색인 + 열 또는 열이 경계를 벗어난 경우 행 끝 색인을 리턴합니다. getTrueLineCount()메소드를 재사용 할 수 있으며 , 텍스트 줄 바꿈을 무시하고 행 수를 반환합니다 TextView.getLineCount().


0

kotlin에서 다음과 같은 확장 기능을 만들 수 있습니다.

fun EditText.placeCursorAtLast() {
    val string = this.text.toString()
    this.setSelection(string.length)
}

그리고 간단히 전화 myEditText.placeCursorAtLast()


0

EditText에서 커서 위치를 설정하려면? 아래 코드를 사용해보십시오

EditText rename;
 String title = "title_goes_here";
 int counts = (int) title.length();
 rename.setSelection(counts);
 rename.setText(title);

0

안드로이드에서 (xxx) xxx-xxxx와 같이 US Mobile에서 포맷 한 후 자동으로 마지막 위치로 이동하는 커서 위치 문제를 해결하는 방법.

private String oldText = "";
private int lastCursor;
private EditText mEtPhone;

@Override
    public void afterTextChanged(Editable s) {
String cleanString = AppUtil.cleanPhone(s.toString());

String format = cleanString.length() < 11 ? cleanString.replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3") :
                cleanString.substring(0, 10).replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3");


boolean isDeleted = format.length() < oldText.length();

        try {

            int cur = AppUtil.getPointer(lastCursor, isDeleted ? s.toString() : format, oldText, isDeleted);
            mEtPhone.setSelection(cur > 0 ? cur : format.length());

        }catch (Exception e){
            e.printStackTrace();
            mEtPhone.setSelection(format.length());
        }

        mEtPhone.addTextChangedListener(this);

    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        oldText = s.toString();
        lastCursor = start;
    }

필자의 경우 ActivityClass에 아래 메소드를 정의하십시오. 활동 이름은 AppUtil이며 전 세계적으로 액세스하십시오.

public static int getPointer(int index, String newString, String oldText, boolean isDeleted){

        int diff = Math.abs(newString.length() - oldText.length());

        return diff > 1 ? isDeleted ? index - diff : index  + diff : isDeleted ? index : index + 1;
    }

public static String cleanPhone(String phone){

        if(TextUtils.isEmpty(phone))
            return "";

        StringBuilder sb = new StringBuilder();
        for(char c : phone.toCharArray()){
            if(Character.isDigit(c))
                sb.append(c);
        }
        return sb.toString();
    }

특정 위치를 설정하려면

edittext.setSelection(position);

-3

가장 간단한 방법은 패딩을 사용하는 것입니다.

xml의 ​​edittext 섹션에 android : paddingLeft = "100dp"를 추가하십시오. 그러면 커서의 시작 위치가 왼쪽 끝에서 오른쪽으로 100dp 이동합니다.

같은 방법으로 android : paddingRight = "100dp"를 사용할 수 있습니다. 커서의 끝 위치를 100dp 왼쪽에서 오른쪽 끝으로 이동합니다.

자세한 내용은이 문서 확인 내 블로그를 : 안드로이드 : 시작 및 글고 위젯의 위치를 종료 커서 설정


2
패딩은 커서 위치와 관련이 없으며이 특정 상황에서 완전히 잘못된 생각의 학교입니다.
상어
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.