Є два 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