使用输入类型编号在 EditText 中设置文本
Posted
技术标签:
【中文标题】使用输入类型编号在 EditText 中设置文本【英文标题】:Setting text in EditText with input type number 【发布时间】:2021-07-31 21:55:48 【问题描述】:我正在使用仅接受数字作为输入类型的 TextEdit,并且我想在按下按钮时设置 TextEdit 的值。但是,我无法让它工作。
当我只做 textWithAmount.setText(balance),而 balance 很长时,我得到一条波浪线,说这不符合 setText 函数并且我无法运行我的代码。
当我将它转换为 Int (setText(balance.toInt()) 时,我收到以下错误:
android.content.res.Resources$NotFoundException: 字符串资源 ID #0x2710
当我将它转换为 String (setText(balance.toString()) 时,我收到以下错误:
java.lang.ClassCastException: android.text.SpannableStringBuilder 无法转换为 java.lang.Long
Kotlin 代码:
val buttonAll = findViewById<Button>(R.id.buttonWithAll)
var balance : Long = 0
buttonAll.setOnClickListener
textAmount.setText(balance.toInt())
XML:
<EditText
android:id="@+id/textWithAmount"
android:layout_
android:layout_
android:layout_marginStart="16dp"
android:layout_marginTop="10dp"
android:ems="100"
android:importantForAutofill="no"
android:inputType="number"
app:layout_constraintEnd_toStartOf="@+id/buttonWithAll"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView4" />
<Button
android:id="@+id/buttonWithAll"
android:layout_
android:layout_
android:layout_marginEnd="9dp"
android:text="@string/all"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/textWithAmount"
app:layout_constraintTop_toTopOf="@+id/textWithAmount" />
有人知道这个问题的解决方案吗?任何答案将不胜感激
编辑: 我刚刚意识到我在同一个 TextEdit 上也有一个 textChangedListener,当我填充它时可能会调用它。也许那里有问题:
textAmount.addTextChangedListener text ->
val input : Long = text as Long
if(input > cash)
textAmount.setText(cash.toString())
```
【问题讨论】:
你在使用Spannable
吗?
@cutiko 不,我不是
balance.toString()
不会转换为字符串。它通过转换输入 Long 创建一个新的 String 对象。我们必须查看更多关于此的代码才能知道出了什么问题。您发布的内容应该只是将字符串传递给setText
,这样应该可以正常工作。您的错误表明您正在尝试将 SpannableStringBuilder 转换为 Long,这是您必须在代码的其他地方执行的操作。请显示您在其中放置 as Long
之类的代码
@Tenfour04 我刚刚注意到可能是什么问题;我在同一个 texfield 上也有一个 textchangedlistener,当我以编程方式填充 textedit 时可能会调用它。它的代码在这里:textAmount.addTextChangedListener text -> val input : Long = text as Long if(input > cash) textAmount.setText(cash.toString())
【参考方案1】:
setText(balance.toString())
是正确的。您的错误出现在您在评论中发布的代码中。
java.lang.ClassCastException
是因为您将一些不是 Long 的东西转换为 Long。我想也许您需要澄清转换某些东西和铸造某些东西之间的区别。强制转换(使用 as
关键字)不会将一种类型的对象转换为另一种类型的对象。强制转换是您告诉编译器对象已经是其他类型的对象。
当您进行强制转换时,编译器会接受您比编译器更了解的话,它允许您像对待其他类型的对象一样对待它。然后在运行时,如果您对编译器的声明不正确,它将崩溃并抛出 ClassCastException。
出于这些原因,您根本不应该使用as
。这是针对特殊情况的,例如如果您有一个 List<Any>
并且您想从中提取一些东西并将其视为更具体的类。或者当您编写一个使用泛型的类并遇到编译器无法确定类型的情况时。或者当对象实现了多个接口并且您想将其传递给哪个函数重载时存在歧义。
当您从 TextView 获取文本时,它是某种 CharSequence 对象,特别是 SpannableStringBuilder。如果要将其用作 Long,则必须转换 为 Long,不强制 为 Long。您还应该考虑这样一个事实,即传递给您的侦听器的现有内容可能不是可以真正转换为 Long 的非空文本。为此,如果无法转换文本,您可以使用 Elvis 运算符设置默认值。
textAmount.addTextChangedListener text ->
val input : Long = text?.toString()?.toLongOrNull() ?: 0L
if(input > cash)
textAmount.setText(cash.toString())
【讨论】:
感谢您的回答和解释,现在可以使用了!text
可以为空,并且您也没有处理空文本,这会引发异常@Tenfour04
没错,还有更多问题需要解决。我会更新的。【参考方案2】:
发生的情况是 balance.toInt()
是一个数字,所以当您使用 setText
时,您使用的是采用数字参数的方法。
setText(@Stringres ...)
由于这只是一个数字而不是在strings.xml
文件中生成的字符串资源,因此无法找到它并崩溃
试试这个
setText("$balance")
关于文本侦听器部分也可能有一些改进
val input = editable?.toString()?.toLongOrNull() ?: return@addTextChangedListener
那里的 lambda 参数是可编辑的,而不是文本,当将文本解析为任何数字类型时,总会有数字格式异常的机会,例如,空文本。
【讨论】:
仅供参考,我认为toLongOrNull()
比捕获 NumberFormatException 更合适,基于this。 “根据经验,你不应该在一般的 Kotlin 代码中捕获异常。那是代码的味道。”以上是关于使用输入类型编号在 EditText 中设置文本的主要内容,如果未能解决你的问题,请参考以下文章
如何使用javascript在文本区域中设置输入类型文本中的值? [复制]