首页 > 解决方案 > 如何改变 observableField 中的传入字符串

问题描述

我将以下字段绑定到editText。

val lastName = ObservableField(MutableLiveData<String>())

我想改变输入的字符串,以便第一个字母自动设置为大写。

所以如果你输入

williams -> Williams

我想我可以通过这样做来解决这个问题,如下所示

    lastName.getObservable()
        .subscribe { input ->
            val lastname = input.decapitalize()
            lastName.getField().postValue(lastname.capitalize())
        }

我注意到这样做会使我陷入一个永恒的循环,因为后值每次都会触发订阅。我怎样才能通过 RxJava 改变传入的字符串,而不必以我现在的方式进行呢?

标签: androidkotlinrx-java

解决方案


您可以通过覆盖在源头执行此操作set。我没有看到多层可观察性的原因,所以我在这里将其展平。

val lastName = object: ObservableField<String>() {
        override fun set(value: String) {
            super.set(value.capitalize())
        }
    }

如果出于某种原因需要分层,则可以改写setValueMutableLiveData 的方法。

val lastName = ObservableField(object: MutableLiveData<String>() {
        override fun setValue(value: String) {
            super.setValue(value.capitalize())
        }
    })

但是这种多层结构让我很费解。如果可以覆盖 LiveData 实例,我看不出如何可靠地订阅基础数据。


推荐阅读