programing

EditText에서 텍스트 끝에 커서를 놓습니다.

javaba 2022. 7. 10. 11:31
반응형

EditText에서 텍스트 끝에 커서를 놓습니다.

나는 의 값을 바꾸고 있다.EditTextkeyListener.

이 에 있는 합니다.EditText을 사용법

EditText.

이것을 시험해 보세요.

갱신:

코틀린:

editText.setSelection(editText.length())//placing cursor at the end of the text

자바:

editText.setSelection(editText.getText().length());

문자열 값을 현재 편집 텍스트 값에 추가하고 커서를 값 끝에 배치하는 ediitext용 추가라는 기능이 있습니다.문자열 값은 현재 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.text.length)

아래 코드는 두 번째 문자 뒤에 커서를 놓습니다.

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

자바:

커서를 시작 위치로 설정합니다.

 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() {
             editText.setSelection(editText.getText().length());
         }
});

Edit 5/16/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());

제 경우 다음과 같은 kotlin ext를 만들었습니다.기능, 누군가에게 유용할 수 있음

 private fun EditText.focus(){
        requestFocus()
        setSelection(length())
    }

그리고 다음과 같이 사용하세요.

mEditText.focus()

EditText가 명확하지 않은 경우:

editText.setText("");
editText.append("New text");

또는

editText.setText(null);
editText.append("New text");

할 수 예요.EditText's 법 methodsetSelection(), 여기를 참조해 주세요.

/**
 * 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());

이 질문은 오래되고 답변이 되었지만, Android용으로 새로 출시된 DataBinding 툴을 사용하고 싶다면 XML에서 다음과 같이 설정하기만 하면 도움이 될 것 같습니다.

<data>
    <variable name="stringValue" type="String"/>
</data>
...
<EditText
        ...
        android:text="@={stringValue}"
        android:selection="@{stringValue.length()}"
        ...
/>

editText.setSelection원하는 할 수 .기본적으로 선택 시 원하는 위치에 커서를 둘 수 있습니다.

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

EditText를 선택합니다.으로는 ★★★★★★★★★★★★★★.editText.getText().length()는 텍스트 길이를 제공합니다. '아예'를 쓰겠습니다.setSelection길이와 함께.

editText.setSelection(0);

시작 위치(0)에 커서를 설정하기 위한 것입니다.

여기에 이미지 설명 입력

Hello Try This

 <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 ★★★

모든 텍스트를 선택하고 기존 텍스트 대신 새 텍스트를 입력하려는 경우

    android:selectAllOnFocus="true"

이것은 동작합니다.

Editable etext = edittext.getText();
Selection.setSelection(etext,edittext.getText().toString().length());

View Model, Live Data 및 데이터 바인딩의 경우

는 이 했습니다.EditText내 노트 앱에서 여러 줄 지원을 제공합니다.나는 사용자가 노트 텍스트가 있는 조각으로 이동할 때 텍스트 끝에 커서를 원했다.

djleop이 제시한 해법은 거의 일치한다.그러나 사용자가 편집을 위해 커서를 텍스트 중간에 놓고 입력을 시작하면 커서가 텍스트 끝으로 다시 이동한다는 것이 문제입니다.이 일이 일어난 것은LiveData그러면 새로운 값이 출력되고 커서가 다시 텍스트 끝으로 이동하게 되어 사용자가 중간에 텍스트를 편집할 수 없게 됩니다.

문제를 저는 이이 to to to를 사용합니다.MediatorLiveData 해서 길이를 .String★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★LiveData fragment를 사용합니다.그런 다음 사용자는 텍스트를 편집할 위치에 커서를 둘 수 있습니다.

뷰 모델

private var accessedPosition: Boolean = false

val cursorPosition = MediatorLiveData<Event<Int>>().apply {
    addSource(yourObject) { value ->
        if(!accessedPosition) {
            setValue(Event(yourObject.note.length))
            accessedPosition = true
        }
    }
}

서서,,yourObject는, 「String」에 하고 있는 한 또 입니다.EditText.

에 이 바인드 .MediatorLiveDataEditText를 선택합니다.

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 표시

Event여기 수업은 구글의 호세 알케레카가 싱글 라이브 이벤트와 같다.화면 회전을 관리할 때 사용합니다.싱글을 사용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's already been handled.
     */
    fun peekContent(): T = content
}

이것은 나에게 있어서 효과적이고 좋은 사용자 경험을 제공하는 솔루션입니다.당신의 프로젝트에도 도움이 되길 바랍니다.

사용자가 여전히 캐럿/커서를 문자열의 중간 위치에 배치할 수 있기 때문에 테스트한 다른 모든 코드는 제대로 작동하지 않았습니다(예: 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"/>

@string/amount="0.00" @string/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) {

            }
        });

도움이 됐으면 좋겠다!

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

이렇게 하면 안전하게 기능합니다.

    editText.setText("");
    if (!TextUtils.isEmpty(text)) {
        editText.append(text);
    }
etSSID.setSelection(etSSID.getText().length());

위의 답변은 나에게 효과가 없었다.그래서 나는 새로운 해결책을 찾았다.이건 누군가에게 도움이 될지도 몰라.저는 현재 Android Studio의 최신 버전인 3.5를 사용하고 있습니다.아마도 그것이 위의 답변들이 아무런 효과를 나타내지 못한 이유일 것이다.

코드:

EditText available_seats = findViewById(R.id.available_seats);
Selection.setSelection(available_seats.getText(),available_seats.getText().length());

여기서 첫 번째 인수는 재생하는 Spannable 텍스트 값이고 두 번째 인수는 인덱스 값입니다.텍스트 끝에 커서를 놓기 위해 텍스트 길이를 반환하는 getText().length()를 선택했습니다.

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) {

    }
}

이 CustomEdit 사용자XML 파일에 텍스트가 포함되어 있으면 동작합니다.나는 이것을 테스트했고, 그것은 나에게 효과가 있다.

EditText 보기에서 텍스트 끝에 커서를 놓으려면

 EditText rename;
 String title = "title_goes_here";
 int counts = (int) title.length();
 rename.setSelection(counts);
 rename.setText(title);
editText.accessibilityDelegate = object : View.AccessibilityDelegate() {
    override fun sendAccessibilityEvent(host: View?, eventType: Int) {
        super.sendAccessibilityEvent(host, eventType)
        if (eventType == TYPE_VIEW_TEXT_SELECTION_CHANGED) {
            editText.setSelection(editText.length())
        }
    }
}

언급URL : https://stackoverflow.com/questions/6217378/place-cursor-at-the-end-of-text-in-edittext

반응형