EditText 컨텐트 끝내기

10078 단어 AndroidEditText

개요


WebView처럼 EditText 내에서 텍스트를 읽어들이고 싶어서 조사했습니다.

구체적으로 말하자면, 나는 편집 중인 텍스트를 검색하는 기능을 만들고 싶은 동기가 있다.

이루어지다


EditText에서find의 API를 준비하지 않은 것 같아서 String류indexOf(String str, int fromIndex)lastIndexOf(String str, int fromIndex)로 텍스트의 위치를 찾아 EditTextsetSelection(int start, int stop) 방법으로 선택할 필요가 있다.
그래서 다음과 같은 내용을 실현해 봤다.
EditTextFinder.kt
/*
 * Copyright (c) 2019 toastkidjp.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompany this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html.
 */
package jp.toastkid.yobidashi.editor

import android.widget.EditText

class EditTextFinder(private val editText: EditText) {

    private var lastIndex = 0

    fun findUp(text: String) {
        if (lastIndex <= 0) {
            lastIndex = editText.text.length
        }

        selectTextByIndex(findBackwardIndex(text), text);

        val nextBackwardIndex = findBackwardIndex(text)
        if (nextBackwardIndex == -1) {
            lastIndex = editText.text.length
        }
    }

    private fun findBackwardIndex(text: String): Int {
        val index = lastIndex - text.length - 1
        if (index < 0) {
            return -1
        }
        val haystack = editText.text.toString()
        return haystack.lastIndexOf(text, index)
    }

    fun findDown(text: String) {
        selectTextByIndex(findNextForwardIndex(text), text)
        val nextForwardIndex = findNextForwardIndex(text)
        if (nextForwardIndex == -1) {
            lastIndex = 0
        }
    }

    private fun selectTextByIndex(index: Int, text: String) {
        if (index < 0) {
            lastIndex = 0
            return
        }
        requestFocusInputArea()
        lastIndex = index + text.length
        editText.setSelection(index, lastIndex)
    }

    private fun findNextForwardIndex(text: String) {
        return editText.text.indexOf(text, lastIndex)
    }

    private fun requestFocusInputArea() {
        editText.requestFocus()
    }

}

주의


이러한 상황을 실현하려면 한 화면에 두 개 이상(예를 들어 검색 대상의 문자열을 입력하는 EditText와 검색 문자열의 대상이 되는 EditText)이 있어야 한다. 따라서 setSelection을 호출하기 전에 RequestFocus에서 검색 대상의 EditText에 초점을 맞추는 것을 잊지 마세요.

활용단어참조


그리고 검색 상자의 위아래 단추를 사용하는 OnclickListener를 각각 호출해서 이렇게 쓰면 OK입니다.
이용 예
private lateinit var finder: EditTextFinder

override fun onCreate(savedInstanceState: Bundle?) {
    finder = EditTextFinder(binding.editorInput)

    backward.setOnClickListener {
        finder.findUp(text)
    }

    forward.setOnClickListener {
        finder.findDown(text)
    }

참고 자료

  • EditText(Android Developers Documentation)
  • 좋은 웹페이지 즐겨찾기