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?
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?
Câu trả lời:
Trong đó vị trí là một int:
editText1.setSelection(position)
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, etmsg
là EditText
etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);
etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
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);
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 EditText
khi hoạt động của bạn mở ra? Trong trường hợp đó requestFocus()
sử dụng dòng dưới đây
e2.setSelection(e2.length());
e2
đang chỉnh sửa văn bản Tên đối tượng
Đặ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.
đô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());
}
});
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:
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()
.
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());
Nhớ cuộc gọi requestFocus()
trước setSelection
cho edittext.
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);
Nếu bạn muốn đặt con trỏ theo n
ký 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>
^
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
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 xgetIndexFromPos(x, -1)
Chuyển đến cột cuối cùng của dòng xgetIndexFromPos(-1, y)
Chuyển đến cột y của dòng cuối cùnggetIndexFromPos(-1, -1)
Chuyển đến cột cuối cùng của dòng cuối cùngTấ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()
.
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);
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);
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