Làm cách nào để đặt vị trí con trỏ trong EditText?


235

Có hai EditText, trong khi tải trang, một văn bản được đặt trong EditText đầu tiên, vì vậy bây giờ con trỏ sẽ ở vị trí bắt đầu EditText, tôi muốn đặt vị trí con trỏ trong EditText thứ hai không chứa dữ liệu. làm như thế nào?


2
bạn có thể đặt trọng lực của nó thành 'centre'.it sẽ tự động đặt con trỏ ở giữa. văn bản của bạn cũng sẽ được tập trung sau đó.
Hirus Vadodaria

trước hết, hãy thử cải thiện tỷ lệ chấp nhận của bạn. Thứ hai, bạn có ý nghĩa gì khi đặt vị trí con trỏ, khi không có văn bản trong edittext?
Vladimir

Câu trả lời:


483

Trong đó vị trí là một int:

editText1.setSelection(position)

Có cách nào để làm điều này tại tệp XML không?
kike

@kike Tôi không nghĩ vậy
atasoyh

1
sử dụng android: lựa chọn trong xml với ràng buộc dữ liệu
Mubarak Mohideen

95

Tôi đã thực hiện theo cách này để đặt vị trí con trỏ ở cuối văn bản sau khi cập nhật văn bản của EditText theo chương trình ở đây, etmsglà EditText

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

4
+1 ah! Thật tuyệt khi nó giúp tôi đặt vị trí con trỏ trong edittext.
Dharmendra

2
Điều này đã không làm việc cho tôi. Tôi có chuỗi Spannable trong EditText của tôi. Có một cách giải quyết cho điều đó?
toobsco42

1
@ toobsco42 Xin chào, tôi vừa thử sử dụng Chuỗi Spannable trong edittext .. hãy kiểm tra pastebin.com/i02ZrNw4 này và nó đang hoạt động như mong đợi .. kiểm tra và so sánh
MKJParekh

Điều này có thể từ tập tin xml? @MKJParekh
Yog Guru

1
Có vẻ như làm điều tương tự:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
Steve Blackwell

37

Cách đặt vị trí Chỉnh sửa con trỏ trong Android

Dưới đây là Mã Set con trỏ để bắt đầu trong EditText:

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

Mã bên dưới được đặt con trỏ đến cuối của EditText:

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

Mã bên dưới được đặt con trỏ sau một số vị trí ký tự thứ 2:

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

17

Tôi muốn đặt vị trí con trỏ trong edittext không chứa dữ liệu

Chỉ có một vị trí trong một EditText trống, đó là setSelection(0).

Hay bạn có nghĩa là bạn muốn tập trung vào EditTextkhi hoạt động của bạn mở ra? Trong trường hợp đó requestFocus()


setSelection (0) không hoạt động, tôi không muốn tập trung vào EditText thứ hai, tôi chỉ muốn đặt con trỏ trong EditText thứ hai
nila

3
Nếu tôi nhớ chính xác, khi một EditText yêu cầu tiêu điểm, con trỏ được đặt. Đọc cái này
Reno


9

Đặt editText2 là khung nhìn EditText thứ hai của bạn. Sau đó đặt đoạn mã sau vào onResume ()

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

hoặc đặt

<requestFocus />

trong bố cục xml của bạn trong chế độ xem Chỉnh sửa thứ hai.


7

đôi khi chỉnh sửa con trỏ văn bản donot đến ở vị trí cụ thể là nếu chúng ta trực tiếp sử dụng editText.setSelection(position);. Trong trường hợp đó bạn có thể thử

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

7

Nếu bạn muốn đặt con trỏ ở một vị trí nhất định trên EditText, bạn có thể sử dụng:

yourEditText.setSelection(position);

Ngoài ra, có khả năng đặt vị trí ban đầu và cuối cùng, để bạn lập trình chọn một số văn bản theo cách này:

yourEditText.setSelection(startPosition, endPosition);

Xin lưu ý rằng việc thiết lập lựa chọn có thể khó khăn vì bạn có thể đặt con trỏ trước hoặc sau một ký tự, hình ảnh bên dưới giải thích cách lập chỉ mục hoạt động trong trường hợp này:

nhập mô tả hình ảnh ở đây

Vì vậy, nếu bạn muốn con trỏ ở cuối văn bản, chỉ cần đặt nó thành yourEditText.length().


5

setSelection(int index)phương pháp trong Edittextnên cho phép bạn làm điều này.


4

như một lời nhắc nhở: nếu bạn đang sử dụng edittext.setSelection()để đặt con trỏ và nó KHÔNG hoạt động trong khi thiết lập một alertdialogví dụ, hãy đảm bảo đặt selection()SAU hộp thoại đã được tạo

thí dụ:

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

3

Mã này sẽ giúp bạn hiển thị con trỏ của bạn ở vị trí chỉnh sửa văn bản cuối cùng.

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


1

Tôi sẽ không nhận được phương thức setSelection () trực tiếp, vì vậy tôi đã thực hiện như bên dưới và làm việc như bùa mê

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ếu bạn muốn đặt con trỏ theo nký tự từ phải sang trái thì bạn phải làm như thế này.

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

Nếu văn bản của edittext như

version<sub></sub>

và bạn muốn di chuyển con trỏ ở vị trí thứ 6 từ phải sang

Sau đó, nó sẽ di chuyển con trỏ tại-

    version<sub> </sub>
                ^

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

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

0

Đặt con trỏ thành một hàng và cột

Bạn có thể sử dụng đoạn mã sau để có được vị trí trong EditText tương ứng với một hàng và cột nhất định. Sau đó, bạn có thể sử dụng editText.setSelection(getIndexFromPos(row, column))để đặt vị trí con trỏ. Các cuộc gọi sau đây đến phương thức có thể được thực hiện:

  • getIndexFromPos(x, y) Chuyển đến cột y của dòng x
  • getIndexFromPos(x, -1) Chuyển đến cột cuối cùng của dòng x
  • getIndexFromPos(-1, y) Chuyển đến cột y của dòng cuối cùng
  • getIndexFromPos(-1, -1) Chuyển đến cột cuối cùng của dòng cuối cùng

Tất cả các giới hạn dòng và cột được xử lý; Nhập một cột lớn hơn chiều dài của dòng sẽ trả về vị trí ở cột cuối cùng của dòng. Nhập một dòng lớn hơn số dòng của EditText sẽ đi đến dòng cuối cùng. Nó phải đủ đáng tin cậy vì nó đã được thử nghiệm nhiều.

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;
}

Câu hỏi đã được trả lời nhưng tôi nghĩ ai đó có thể muốn làm điều đó thay vào đó.

Nó hoạt động bằng cách lặp qua từng ký tự, tăng số dòng mỗi lần nó tìm thấy dấu phân cách dòng. Khi số dòng bằng với dòng mong muốn, nó sẽ trả về chỉ mục hiện tại + cột hoặc chỉ mục kết thúc dòng nếu cột nằm ngoài giới hạn. Bạn cũng có thể sử dụng lại getTrueLineCount()phương thức, nó trả về số dòng bỏ qua gói văn bản, không giống như TextView.getLineCount().


0

Trong kotlin, bạn có thể tạo một chức năng mở rộng như thế này:

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

và sau đó chỉ cần gọi myEditText.placeCursorAtLast()


0

Nếu bạn muốn đặt vị trí con trỏ trong EditText? thử những đoạn mã dưới đây

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

0

Cách giải quyết vấn đề vị trí con trỏ tự động di chuyển đến vị trí cuối cùng sau khi định dạng trong US Mobile như (xxx) xxx-xxxx trong Android.

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;
    }

Xác định phương thức bên dưới cho bất kỳ Lớp hoạt động nào trong trường hợp của tôi Tên hoạt động là AppUtil và truy cập nó trên toàn cầu

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();
    }

Và nếu bạn muốn đặt bất kỳ vị trí cụ thể

edittext.setSelection(position);

-2

Tôi tin rằng cách đơn giản nhất để làm điều này chỉ là sử dụng phần đệm.

Nói trong phần edittext của xml của bạn, thêm android: paddingLeft = "100dp" Điều này sẽ di chuyển vị trí bắt đầu của con trỏ 100dp của bạn từ đầu bên trái.

Tương tự, bạn có thể sử dụng android: paddingRight = "100dp" Điều này sẽ di chuyển vị trí cuối của con trỏ 100dp sang trái từ đầu bên phải.

Để biết thêm chi tiết, hãy kiểm tra bài viết này trên blog của tôi : Android: Đặt vị trí bắt đầu và kết thúc con trỏ trong EditText Widget


2
Padding không liên quan gì đến vị trí con trỏ và là một trường phái suy nghĩ hoàn toàn sai lầm trong tình huống cụ thể này.
Cá mập
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.