当前位置: 首页 > 知识库问答 >
问题:

如何在静态编程语言中使用反向绑定适配器将小写文本转换为大写?

慕飞章
2023-03-14

我正在创建一个android应用程序,我想使用一个功能,其中我们已经输入到editText字段的文本可以在运行时转换为大写,仅在特定的editText字段。

我试过这个代码

editText.addTextChangedListener(object : TextWatcher {
  override fun afterTextChanged(s: Editable?) {
  }

  override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
  }

  override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
     this.text.toString().uppercase()
  }
 })

但是它可以很容易地通过Android中的反向绑定适配器的概念来实现。我已经尝试参考https://developer.android.com/reference/android/databinding/InverseBindingAdapter

在我的项目中,它对我不起作用。你能一步一步地给我解释一下吗?

共有1个答案

姬裕
2023-03-14

是的,addTextChangedListener的这个方法是可用的,但是我们必须为每个我们想要转换成大写的Edittext实现这个方法。所以你对反向绑定适配器的了解是正确的。在InverserBinding Adapter中,我们必须一次性创建此方法,并且您可以多次使用它。

我已经使用BindingAdapter和InverseBinding Adapter实现了这一点。在一个Kotlin文件中,按如下方式编写这两个函数。功能代码

@BindingAdapter(value = ["setText", "custom:AttrChanged"], requireAll = false)
fun EditText.updateText(text: String?, listener: InverseBindingListener) {
    if (this.text.toString() != text) {
        this.setText(text)
    }
    this.doOnTextChanged { _: CharSequence?, _: Int?, _: Int?, _: Int? ->
        listener.onChange()
    }
}

@InverseBindingAdapter(attribute = "setText", event = "custom:AttrChanged")
fun EditText.getUpdatedText(): String? {
    return this.text.toString().uppercase()
}

对于大写,我创建了一个字符串类型的MutableLiveData大写变量

var uppercase = MutableLiveData("")

现在在XML中,我将该属性设置为:

<androidx.appcompat.widget.AppCompatEditText
        android:id="@+id/edit_txt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="30dp"
        setText="@={viewModels.uppercase}"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/btn_login_data_binding" />
 类似资料:
  • 我想在google api中更改我的标记。所以我在Picasso中使用了“getBitmap”功能,但此功能返回“位图?” .icon(位图描述符从位图(获取位图(user_URL[i])) - 所以,问题是: 类型不匹配错误(需要:位图,找到:位图?) java.lang.NullPointerException:图像在同一行中不能为空 我如何在科特林解决这个问题? 法典: 私人乐趣得到位图(网

  • 我正在尝试将我的Java类转换为静态编程语言,这是Java代码: 这就是我把它转换成的: Lambda符号似乎根本不起作用,或者我就是搞不懂。我在Kotlin中发现的所有双函数示例都直接返回这样的值 双函数{名称,年龄- 这在语法上是正确的,但在返回某些内容之前,我需要一些额外的逻辑。出现两条错误消息: > 类型不匹配。必需:单位,找到:字符串 但我确实想返回一个字符串,我还显式声明了它。但是,还

  • 需要帮助。我已经检查了堆栈溢出中的其他一些解决方案,但我没有到达使我的片段工作。 问题:当我显示我的片段时,我的屏幕是空的,我有错误“E/RecyclerView:没有连接适配器;跳过布局” 3个问题(当然有联系): E/RecyclerView:未连接适配器;跳过布局错误 片段(XML) 一行数据(一天) 片段类 适配器类 我尝试在onCreateView、onCreate和onResume中初

  • 上周我更新了Kotlin 1.5,昨天看到谷歌打算让Jetpack成为设计UI的首选选项后,我想做一些测试。 问题是将我的项目更新为静态编程语言1.5,当尝试构建项目时,我得到以下错误: 静态编程语言1.5与Jetpack Compose不兼容吗?在谷歌搜索问题后,我找到了版本,其中提到了Jetpack Compose,但不是以“不兼容”的方式。 你对此有任何答案吗?我应该使用吗?在这种情况下,我

  • 我正在尝试在Spring的TransactionTemplate上编写Kotlin包装器。关键代码如下所示: 代码无法编译。这是因为Java类TransactionCallback在Java中定义为: 在静态编程语言中解释为返回可空的T-,但我的方法返回。 如何更改此代码以使其可编译,同时允许调用方使用可为null的类型作为泛型类型? 我可以做这样的事情: 但是我的调用者将无法传递类型为

  • 为了描述Gradle构建脚本,我们可以通过< code>build.gradle.kts文件使用Kotlin。在< code>dependencies和build 部分全局定义要使用的Kotlin版本是一个常见的问题(在给定的情况下使用不同的版本是相当罕见的)。 请考虑以下代码 (Gradle 4.3.1): 如您所见,kotlin(在本例中为1.2.30)定义了两次:和,它们通常没有区别。由于D