【发布时间】:2021-01-16 18:01:13
【问题描述】:
我有一个EditText,其中包含一些不得删除的预先存在的文本。应该只允许用户在视图中附加文本。
我现在的解决方案如下所示,我检查EditText 的新长度是否比原始文本短。如果是,用户试图删除一个字符,所以我只需用原始文本重新填充视图并移动光标。这个解决方案的问题是,用户可以只输入比原始长度更长的文本,然后将光标的位置更改到原始文本中的某个位置,最后删除字符。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val originalText = "Hello"
binding.et.setText(originalText)
binding.et.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
s?.let {
if (s.length < originalText.length) {
binding.et.setText(originalText)
binding.et.setSelection(originalText.count())
}
}
}
override fun afterTextChanged(s: Editable?) {}
})
}
我该怎么办?我对所有想法持开放态度。
谢谢!
编辑:
我也尝试过将EditText 和TextView 组合在一起(正如一些人所建议的那样),但布局很难实现,因为原始文本和新文本都可以跨越多行。我上面的解决方案在原文中包含一个单词,但可能很多。所以我需要迎合这种情况:
...其中白框代表TextView,红框代表EditText。
我认为 Bö macht Blau 的答案也行不通,因为前缀在它自己的“列”中。
我想我必须将 Zain 的解决方案与 (startsWith()) 一起使用,或者创建一个自定义视图(尽管我以前从未做过其中之一)。
【问题讨论】:
-
考虑使用InputFilter
-
EditText 不是合适的工具。我会查看 TextField 和 EditText 的组合,或者使用可以从 EditText 派生的功能编写自定义视图
-
这很 hacky,但是为什么不在 EditText 的左侧添加一个带有固定文本的 TextView,并以某种方式设置两个视图的样式,使它们看起来像一个单独的视图。
-
我已经更新了我的帖子,以包含更多关于我尝试过的以及我想要实现的目标的详细信息。
标签: android kotlin text android-edittext