Є два EditText, під час завантаження сторінки текст встановлюється в першому EditText, Отже, курсор буде на початковому місці EditText, я хочу встановити позицію курсору у другому EditText, яка не містить даних. Як це зробити?
Є два EditText, під час завантаження сторінки текст встановлюється в першому EditText, Отже, курсор буде на початковому місці EditText, я хочу встановити позицію курсору у другому EditText, яка не містить даних. Як це зробити?
Відповіді:
Де позиція - це int:
editText1.setSelection(position)
Я зробив цей спосіб, щоб встановити позицію курсору в кінці тексту після оновлення тексту EditText програмно
тут, etmsgє 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());
Внизу коду встановлено курсор: Починаючи з 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());
Нижче коду встановлено курсор після деякої 2-ї позиції символу:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
Я хочу встановити позицію курсору в редакційному тексті, який не містить даних
У порожньому EditText є лише одна позиція, це setSelection(0).
Або ви мали на увазі, що хочете зосередити свою увагу, EditTextколи ваша діяльність відкриється? У цьому випадку його requestFocus()
використовуйте рядок нижче
e2.setSelection(e2.length());
e2 це редагування тексту Ім'я об'єкта
Нехай editText2 - це ваше друге перегляд EditText. Потім введіть наступний фрагмент коду в onResume ()
editText2.setFocusableInTouchMode(true);
editText2.requestFocus();
або покласти
<requestFocus />
у вашому xml-макеті другого перегляду EditText.
деякий час редагування текстового курсору донота виходить на певну позицію, якщо ми безпосередньо використовуємо editText.setSelection(position);. У такому випадку ви можете спробувати
editText.post(new Runnable() {
@Override
public void run() {
editText.setSelection(string.length());
}
});
Якщо ви хочете розмістити курсор у певному положенні на EditText, ви можете використовувати:
yourEditText.setSelection(position);
Крім того, існує можливість встановити початкову та кінцеву позицію, щоб програмно вибирати текст таким чином:
yourEditText.setSelection(startPosition, endPosition);
Зверніть увагу, що налаштування вибору може бути складним, оскільки ви можете розмістити курсор до або після символу, на зображенні нижче пояснено, як працює індексація в цьому випадку:
Отже, якщо ви хочете курсор в кінці тексту, просто встановіть його yourEditText.length().
як нагадування: якщо ви використовуєте edittext.setSelection()для встановлення курсору, і він НЕ працює під час налаштування, alertdialogнаприклад, переконайтеся, що встановлено selection()ПІСЛЯ було створено діалогове вікно
приклад:
AlertDialog dialog = builder.show();
input.setSelection(x,y);
Цей код допоможе вам показати курсор на останньому місці редагування тексту.
editText.requestFocus();
editText.setSelection(editText.length());
Я не отримаю метод 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);
Якщо ви хочете встановити курсор після nсимволу справа наліво, тоді вам потрібно зробити так.
edittext.setSelection(edittext.length()-n);
Якщо текст редагувати, як
version<sub></sub>
і ви хочете перемістити курсор на 6-му положенні справа
Потім він перемістить курсор на-
version<sub> </sub>
^
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
Ви можете використовувати наступний код, щоб отримати позицію у вашому EditText, яка відповідає певному рядку та стовпцю. Потім можна використовувати editText.setSelection(getIndexFromPos(row, column))для встановлення положення курсору. Можна зробити наступні дзвінки методу:
getIndexFromPos(x, y) Перейдіть до стовпця y рядка xgetIndexFromPos(x, -1) Перейти до останнього стовпця рядка xgetIndexFromPos(-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().
Якщо ви хочете встановити позицію курсору в EditText? спробуйте наступний код
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);
Як вирішити проблему з позицією курсору, яка автоматично переходить на останню позицію після форматування в US Mobile, наприклад (xxx) xxx-xxxx в 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;
}
Визначте нижченаведений метод для будь-якого класу Activity у моєму випадку Назва діяльності - 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);
Я вважаю, що найпростіший спосіб зробити це просто використовувати підкладки.
Скажіть у розділі редагування тексту XML, додайте андроїд: paddingLeft = "100dp" Це перемістить ваше початкове положення курсору на 100 дп направо від лівого кінця.
Так само ви можете використовувати android: paddingRight = "100dp" Це перемістить ваше кінцеве положення курсору на 100 дп ліворуч від правого кінця.
Щоб отримати детальнішу інформацію, перегляньте цю статтю в моєму блозі : Android: Налаштування курсору вихідної та кінцевої позиції у віджеті EditText