Я меняю значение EditText
на keyListener
.
Но когда я меняю текст, курсор перемещается в начало EditText
.
Мне нужно, чтобы курсор находился в конце текста.
Как переместить курсор в конец текста в EditText
.
Я меняю значение EditText
на keyListener
.
Но когда я меняю текст, курсор перемещается в начало EditText
.
Мне нужно, чтобы курсор находился в конце текста.
Как переместить курсор в конец текста в EditText
.
Попробуйте следующее:
EditText et = (EditText)findViewById(R.id.inbox);
et.setSelection(et.getText().length());
Существует функция, называемая append для ediitext, которая добавляет значение строки к текущему значению edittext и помещает курсор в конец значения. Вы можете иметь строковое значение как текущее значение ediitext и вызвать append();
myedittext.append("current_this_edittext_string");
Котлин:
установить курсор в начальную позицию:
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)
установите курсор в конец EditText:
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.getText().length())
Код ниже должен поместить курсор после второго символа:
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(2)
JAVA:
установить курсор в начальную позицию:
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);
Если вы ранее вызывали setText
, а новый текст не получил фазового вызова макета setSelection
в отдельном исполняемом файле, запущенном View.post(Runnable)
(сделайте репост из этой темы).
Итак, для меня этот код работает:
editText.setText("text");
editText.post(new Runnable() {
@Override
public void run() {
registerPhone.setSelection("text".length());
}
});
Изменить 16/05/2019: сейчас я использую расширение Kotlin для этого:
fun EditText.placeCursorToEnd() {
this.setSelection(this.text.length)
}
а затем - editText.placeCursorToEnd().
Вы также можете поместить курсор в конец текста в виде EditText
следующим образом:
EditText et = (EditText)findViewById(R.id.textview);
int textLength = et.getText().length();
et.setSelection(textLength, textLength);
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
editText.setSelection(editText.getText().length());
return false;
}
});
Это еще одно возможное решение:
et.append("");
Просто попробуйте это решение, если оно не работает по какой-либо причине:
et.setSelection(et.getText().length());
Вы можете добиться этого с помощью метода EditText setSelection(), см. здесь
В моем случае я создал следующий kotlin ext. функция может быть полезна кому-то
private fun EditText.focus(){
requestFocus()
setSelection(length())
}
Тогда используйте следующее
mEditText.focus()
/**
* Set cursor to end of text in edittext when user clicks Next on Keyboard.
*/
View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (b) {
((EditText) view).setSelection(((EditText) view).getText().length());
}
}
};
mEditFirstName.setOnFocusChangeListener(onFocusChangeListener);
mEditLastName.setOnFocusChangeListener(onFocusChangeListener);
Это хорошо для меня!
Я думаю, что это может достичь того, чего вы хотите.
Editable etext = mSubjectTextEditor.getText();
Selection.setSelection(etext, etext.length());
Вопрос старый и ответил, но я думаю, может быть полезно иметь этот ответ, если вы хотите использовать недавно выпущенные инструменты DataBinding для Android, просто установите это в свой XML:
<data>
<variable name="stringValue" type="String"/>
</data>
...
<EditText
...
android:text="@={stringValue}"
android:selection="@{stringValue.length()}"
...
/>
Если ваш EditText не ясен:
editText.setText("");
editText.append("New text");
Здравствуйте, попробуйте это
<EditText
android:id="@+id/edt_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!"
android:cursorVisible="true"/>
EditText editText = findViewById(R.id.editText); editText.setSelection(editText.getText().length());//End point
EditText editText = findViewById(R.id.editText); editText.setSelection(editText.getText().length());//End point
Курсор
Если вы хотите выбрать весь текст и просто ввести новый текст вместо старого, вы можете использовать
android:selectAllOnFocus="true"
Это работает
Editable etext = edittext.getText();
Selection.setSelection(etext,edittext.getText().toString().length());
editText.setSelection
- это волшебство здесь. В основном выбор дает вам место курсора в любой позиции, которую вы хотите.
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
Это помещает курсор в конец EditText. В основном editText.getText().length()
дает вам длину текста. Затем вы используете setSelection
с длиной.
editText.setSelection(0);
Он предназначен для установки курсора в исходное положение (0).
Все остальные коды, которые я тестировал, не работали хорошо из-за того, что пользователь все равно мог поместить курсор/курсор где-нибудь в середине строки (например: 12 | 3.00 - где | - это курсор). Мое решение всегда помещает курсор в конец строки всякий раз, когда происходит касание в EditText.
Конечное решение:
// For a EditText like:
<EditText
android:id="@+id/EditTextAmount"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:hint="@string/amount"
android:layout_weight="1"
android:text="@string/zero_value"
android:inputType="text|numberDecimal"
android:maxLength="13"/>
@строки/количество = "0,00" @Строка/zero_value = "0,00"
// Create a Static boolean flag
private static boolean returnNext;
// Set caret/cursor to the end on focus change
EditTextAmount.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View editText, boolean hasFocus) {
if(hasFocus){
((EditText) editText).setSelection(((EditText) editText).getText().length());
}
}
});
// Create a touch listener and put caret to the end (no matter where the user touched in the middle of the string)
EditTextAmount.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View editText, MotionEvent event) {
((EditText) editText).onTouchEvent(event);
((EditText) editText).setSelection(((EditText) editText).getText().length());
return true;
}
});
// Implement a Currency Mask with addTextChangedListener
EditTextAmount.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String input = s.toString();
String output = new String();
String buffer = new String();
String decimals = new String();
String numbers = Integer.toString(Integer.parseInt(input.replaceAll("[^0-9]", "")));
if(returnNext){
returnNext = false;
return;
}
returnNext = true;
if (numbers.equals("0")){
output += "0.00";
}
else if (numbers.length() <= 2){
output += "0." + String.format("%02d", Integer.parseInt(numbers));
}
else if(numbers.length() >= 3){
decimals = numbers.substring(numbers.length() - 2);
int commaCounter = 0;
for(int i=numbers.length()-3; i>=0; i--){
if(commaCounter == 3){
buffer += ",";
commaCounter = 0;
}
buffer += numbers.charAt(i);
commaCounter++;
}
output = new StringBuilder(buffer).reverse().toString() + "." + decimals;
}
EditTextAmount.setText(output);
EditTextAmount.setSelection(EditTextAmount.getText().length());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
/*String input = s.toString();
if(input.equals("0.0")){
EditTextAmount.setText("0.00");
EditTextAmount.setSelection(EditTextAmount.getText().length());
return;
}*/
}
@Override
public void afterTextChanged(Editable s) {
}
});
Надеюсь, что это поможет!
Это трюк безопасно:
editText.setText("");
if (!TextUtils.isEmpty(text)) {
editText.append(text);
}
похоже на ответ @Anh Duy, но он не работал у меня. я также нуждался в том, чтобы курсор перемещался до конца только тогда, когда пользователь удаляет текст редактирования и по-прежнему может выбрать позицию курсора после этого, это единственный код, который сработал у меня
boolean textFocus = false; //define somewhere globally in the class
//in onFinishInflate() or somewhere
editText.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
editText.onTouchEvent(event);
if(!textFocus) {
editText.setSelection(editText.getText().length());
textFocus = true;
}
return true;
}
});
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
textFocus = false;
}
});
public class CustomEditText extends EditText {
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomEditText(Context context) {
super(context);
}
public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
this.setSelection(this.getText().length());
}
@Override
protected void onSelectionChanged(int selStart, int selEnd) {
}
}
Пользователь этот CustomEditText в вашем XML файле, это сработает. Я тестировал это, и он работает для меня.
Если вы хотите поместить курсор в конец текста в режиме EditText
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);
etSSID.setSelection(etSSID.getText().length());
Мне нужна была эта функциональность для EditText
с поддержкой многострочной обработки в моем приложении заметок. Мне нужен курсор в конце текста, когда пользователь переходит к фрагменту с текстом заметки.
Решение, предложенное djleop, подходит близко. Но проблема в том, что, если пользователь помещает курсор где-то посередине текста для редактирования и начинает вводить текст, курсор снова переходит к концу текста. Это произошло из-за того, что LiveData
издаст новое значение, а курсор снова перейдет к концу текста, в результате чего пользователь не сможет редактировать текст где-то посередине.
Чтобы решить эту проблему, я использую MediatorLiveData
и назначаю ему длину String
только один раз, используя флаг. Это приведет к тому, что LiveData прочитает значение только один раз, то есть когда пользователь перейдет к фрагменту. После этого пользователь может разместить курсор в любом месте, где он хочет редактировать текст.
ViewModel
private var accessedPosition: Boolean = false
val cursorPosition = MediatorLiveData<Event<Int>>().apply {
addSource(yourObject) { value ->
if(!accessedPosition) {
setValue(Event(yourObject.note.length))
accessedPosition = true
}
}
}
Здесь yourObject
- это еще одна LiveData, извлеченная из базы данных, которая содержит текст String, который вы отображаете в EditText
.
Затем привяжите этот MediatorLiveData
к вашему EditText с помощью адаптера привязки.
XML
Использует двустороннюю привязку данных для отображения текста и принятия ввода текста.
<!-- android:text must be placed before cursorPosition otherwise we'll get IndexOutOfBounds exception-->
<EditText
android:text="@={viewModel.noteText}"
cursorPosition="@{viewModel.cursorPosition}" />
Связующий адаптер
@BindingAdapter("cursorPosition")
fun bindCursorPosition(editText: EditText, event: Event<Int>?) {
event?.getContentIfNotHandled()?.let { editText.setSelection(it) }
}
Event
class
Класс Event
здесь похож на SingleLiveEvent, написанный Хосе Альсеррека из Google. Я использую это здесь, чтобы заботиться о повороте экрана. Использование одиночного Event
гарантирует, что курсор не перейдет к концу текста, когда пользователь редактирует текст где-то посередине и экран поворачивается. Он будет оставаться в том же положении при повороте экрана.
Вот класс Event
:
open class Event<out T>(private val content: T) {
var hasBeenHandled = false
private set // Allow external read but not write
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}
/**
* Returns the content, even if it already been handled.
*/
fun peekContent(): T = content
}
Это решение, которое работает для меня и обеспечивает хороший пользовательский опыт. Надеюсь, это поможет и в ваших проектах.
EditText editText=findViewById(R.id.et_id);
editText.requestFocus();