C# путь к имитатору Python Dictionary Syntax

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

мне была нужна эта функциональность для EditText с многострочной поддержкой в моем приложении примечаний. Я хотел курсор в конце текста, когда пользователь перешел к фрагменту, который имеет текст примечания.

решение, предложенное , djleop приближается. Но проблема с этим состоит в том, что, если бы пользователь помещает курсор где-нибудь посреди текста для редактирования и начинает вводить, курсор перешел бы до конца текста снова. Это произошло, потому что эти LiveData испустит новое значение, и курсор перешел бы до конца текста, снова приводящего к пользователю, который не в состоянии отредактировать текст где-нибудь в середине.

Для решения этого я использую MediatorLiveData и присваиваю ему длину String только однажды использование флага. Это заставит LiveData читать значение только однажды, то есть, когда пользователь перейдет к фрагменту. После этого пользователь может установить курсор где угодно, они хотят отредактировать текст там.

ViewModel

private var accessedPosition: Boolean = false

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

Здесь, yourObject является другой LiveData, полученный от базы данных, которая содержит Строковый текст, который Вы отображаете в EditText.

Тогда связывают это MediatorLiveData с Вашим использованием EditText обязательный адаптер.

Использование XML

двухсторонняя привязка данных для отображения текста, а также принятия ввода текста.



Обязательный Адаптер

@BindingAdapter("cursorPosition")
fun bindCursorPosition(editText: EditText, event: Event?) {
    event?.getContentIfNotHandled()?.let { editText.setSelection(it) }
}

Event класс

Event класс здесь похож SingleLiveEvent, записанный Jose AlcГ©rreca из Google. Я использую его здесь для заботы об экранном вращении. Используя сингл Event удостоверится, что курсор не перейдет до конца текста, когда пользователь отредактирует текст где-нибудь в середине, и экран вращается. Это сохранит ту же позицию, когда экран будет вращаться.

Вот Event класс:

open class Event(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
задан Walt W 4 September 2009 в 20:59
поделиться

1 ответ

Этого можно добиться, если у класса есть класс PythonDictionary, который возвращается из mydict ["bc"] и имеет следующие члены.

  • Индексатор. свойство, чтобы разрешить доступ ["de"]
  • Неявное преобразование из строки в PythonDictionary

Это должно позволить обеим случаям нормально компилироваться.

Например

public class PythonDictionary {
    public string this[string index] {
        get { ... }
        set { ... }
    }
    public static implicit operator PythonDictionary(string value) {
        ...
    }
}

public void Example() {
    Dictionary<string, PythonDictionary> map = new Dictionary<string, PythonDictionary>();
    map["42"]["de"] = "foo";
    map["42"] = "bar";
}
12
ответ дан 2 December 2019 в 21:03
поделиться
Другие вопросы по тегам:

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