Мне нужно реализовать повтор/отмену действия для TextField в Jetpack Compose. Для EditText я использовал этот, и он работал хорошо. Однако для Jetpack Compose такого прослушивателя нет. Я бы реализовал собственный метод на основе этого для EditText, но мне не хватает этих двух методов прослушивания, которые недоступны для TextField:
doOnTextChanged { text, start, before, count -> }
doBeforeTextChanged { text, start, count, after -> }
В TextField можно использовать только один прослушиватель
onValuesChange = { }
что возвращается только строка без start и count.
Как мне добиться повтора/отмены для реализации TextField в Jetpack Compose?
Изменить
Это то, что я делал до сих пор. Было бы здорово сделать его работоспособным:
class EditTextDo {
private var mIsUndoOrRedo = false
private val editHistory: EditHistory? = null
fun redo() {
val edit = editHistory?.getNext() ?: return
// Do Redo
}
fun undo() {
val edit = editHistory?.getPrevious() ?: return
// Do Undo
}
fun canUndo(): Boolean {
editHistory?.let {
return it.position > 0
}
return false
}
fun canRedo(): Boolean {
editHistory?.let {
return it.position < it.history.size
}
return false
}
}
class EditHistory {
var position = 0
private var maxHistorySize = -1
val history = LinkedList()
private fun clear() {
position = 0
history.clear()
}
fun add(item: EditItem) {
while (history.size > position) {
history.removeLast()
}
history.add(item)
position++
if (maxHistorySize >= 0)
trimHistory()
}
fun getNext(): EditItem? {
if (position >= history.size) {
return null
}
val item = history[position]
position++
return item
}
fun getPrevious(): EditItem? {
if (position == 0) {
return null
}
position--
return history[position]
}
private fun setMaxHistorySize(maxHistorySize: Int) {
this.maxHistorySize = maxHistorySize
if (maxHistorySize >= 0)
trimHistory()
}
private fun trimHistory() {
while (history.size > maxHistorySize) {
history.removeFirst()
position--
}
if (position < 0)
position = 0
}
}
data class EditItem(val start: Int, val before: CharSequence, val after: CharSequence)
Подробнее здесь: https://stackoverflow.com/questions/734 ... xtfield-of
Отменить/Повторить, как обрабатывать doOnTextChanged и doBeforeTextChanged в TextField Jetpack Compose? ⇐ Android
Форум для тех, кто программирует под Android
1715957934
Anonymous
Мне нужно реализовать повтор/отмену действия для TextField в Jetpack Compose. Для EditText я использовал этот, и он работал хорошо. Однако для Jetpack Compose такого прослушивателя нет. Я бы реализовал собственный метод на основе этого для EditText, но мне не хватает этих двух методов прослушивания, которые недоступны для TextField:
doOnTextChanged { text, start, before, count -> }
doBeforeTextChanged { text, start, count, after -> }
В TextField можно использовать только один прослушиватель
onValuesChange = { }
что возвращается только [b]строка[/b] без [b]start[/b] и [b]count[/b].
Как мне добиться повтора/отмены для реализации TextField в Jetpack Compose?
Изменить
Это то, что я делал до сих пор. Было бы здорово сделать его работоспособным:
class EditTextDo {
private var mIsUndoOrRedo = false
private val editHistory: EditHistory? = null
fun redo() {
val edit = editHistory?.getNext() ?: return
// Do Redo
}
fun undo() {
val edit = editHistory?.getPrevious() ?: return
// Do Undo
}
fun canUndo(): Boolean {
editHistory?.let {
return it.position > 0
}
return false
}
fun canRedo(): Boolean {
editHistory?.let {
return it.position < it.history.size
}
return false
}
}
class EditHistory {
var position = 0
private var maxHistorySize = -1
val history = LinkedList()
private fun clear() {
position = 0
history.clear()
}
fun add(item: EditItem) {
while (history.size > position) {
history.removeLast()
}
history.add(item)
position++
if (maxHistorySize >= 0)
trimHistory()
}
fun getNext(): EditItem? {
if (position >= history.size) {
return null
}
val item = history[position]
position++
return item
}
fun getPrevious(): EditItem? {
if (position == 0) {
return null
}
position--
return history[position]
}
private fun setMaxHistorySize(maxHistorySize: Int) {
this.maxHistorySize = maxHistorySize
if (maxHistorySize >= 0)
trimHistory()
}
private fun trimHistory() {
while (history.size > maxHistorySize) {
history.removeFirst()
position--
}
if (position < 0)
position = 0
}
}
data class EditItem(val start: Int, val before: CharSequence, val after: CharSequence)
Подробнее здесь: [url]https://stackoverflow.com/questions/73421813/undo-redo-how-to-handle-doontextchanged-and-dobeforetextchanged-in-textfield-of[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия