如何解决如何防止用户删除 EditText 小部件中预先存在的文本?
我有一个 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?,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()
) 结合使用或创建自定义视图(尽管我以前从未做过其中之一)。
解决方法
请考虑 OP 评论中的 @Gabe Sechan 建议,即 EditText
本身并不是最佳解决方案。
如果您仍然需要使用 EditText
,那么您可以更改条件以检查 CharSequence
观察者返回的 EditText
是否以使用 startsWith()
的原始文本开头方法
et.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?,start: Int,count: Int,after: Int) {}
override fun onTextChanged(s: CharSequence?,before: Int,count: Int) {
s?.let {
if (!s.startsWith(originalText)) {
if (s.length <= originalText.length) {
et.setText(originalText)
et.setSelection(originalText.count())
} else {
et.setText(originalText + s.subSequence(originalText.length,s.length))
et.setSelection(s.count())
}
}
}
}
override fun afterTextChanged(s: Editable?) {}
})
,
您可以使用文本字段,即 TextInputEditText
和 TextInputLayout
的组合。然后你可以像这样设置前缀:
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:prefixText="@string/prefix_text">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.google.android.material.textfield.TextInputLayout>
一旦 TextInputEditText
获得焦点,前缀就会可见。由于它不是 EditText
内容的一部分,因此用户无法对其进行修改。
有用的链接:
,这项检查应该有效:
if (s.substring(0,4) == originalText) {
// update text
}
但考虑查看InputFilter,作为评论建议。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。