Поместите курсор в конец текста в EditText

Поскольку вы уже находитесь на земле Qt, вы можете сделать что-то вроде этого:

from PyQt4.QtCore import QProcess

class YourClass(QObject):

    [...]

    def videoProcess(self):
        self.pushButton.setEnabled(0)
        self.pushButton.setText("Please Wait")
        command = "handbrake.exe"
        args =  ["-i", "somefile.wmv", "-o", "somefile.mp4"]
        process = QProcess(self)
        process.finished.connect(self.onFinished)
        process.startDetached(command, args)

    def onFinished(self, exitCode, exitStatus):
        self.pushButton.setEnabled(True)

    [...]

http://doc.qt.io/qt-5/qprocess.html

799
задан MiguelHincapieC 17 September 2015 в 16:51
поделиться

1 ответ

Для ViewModel LiveData и Привязки данных

мне была нужна эта функциональность для 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, полученный от базы данных, которая содержит Строковый текст, который Вы отображаете в 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 класс

Event класс здесь похож SingleLiveEvent, записанный Jose AlcГ©rreca из 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's already been handled.
     */
    fun peekContent(): T = content
}

Это - решение, которое работает на меня и обеспечивает хороший пользовательский опыт. Надежда это помогает в Ваших проектах также.

1
ответ дан Yogesh Umesh Vaity 4 November 2019 в 06:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: