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

正在onSavedInstanceState()方法[重复]中获取NumberFormatException

呼延辰龙
2023-03-14

我使用的是onSavedInstanceState()方法,这样在旋转设备后,我的textview就不会丢失它的值,但我会遇到我在活动中提到的崩溃。

以下是我的活动

class SavedInstanceActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_saved_instance)

        imgPlus.setOnClickListener {
            if (tvText.text.toString().toInt() >= 10)
                tvText.text = "10"
            else
                tvText.text = tvText.text.toString().toInt().plus(1).toString()
        }

        imgMinus.setOnClickListener {
            if (tvText.text.toString().toInt() <= 0)
                tvText.text = "0"
            else
                tvText.text = tvText.text.toString().toInt().minus(1).toString()
        }

        if (savedInstanceState != null) {
            count = savedInstanceState.getInt("int", 0)
            tvText.text = count.toString()
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putInt("int", tvText.toString().toInt())  //getting crash here java.lang.NumberFormatException: For input string: "com.google.android.material.textview.MaterialTextView{12c8970 V.ED..... ........ 511,982-570,1084 #7f080174 app:id/tvText}"
        Log.d("saved", tvText.toString())
    }
}

共有3个答案

养翔
2023-03-14

我不建议依赖文本UI元素来存储非文本应用程序状态。这有点复杂。我将把count作为Int属性,并将其与TextView同步。实际上,如果有,我会将计数放在ViewModel中,但为了简单起见:

class SavedInstanceActivity : AppCompatActivity() {

    private var count = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_saved_instance)

        imgPlus.setOnClickListener {
            count = min(count + 1, 10)
            tvText.text = count.toString()
        }

        imgMinus.setOnClickListener {
            count = max(count - 1, 0)
            tvText.text = count.toString()
        }

        if (savedInstanceState != null) {
            count = savedInstanceState.getInt("int", 0)
            tvText.text = count.toString()
        }
    }

    //...
}

为了更进一步,可以使属性在更改时自动更新文本视图:

class SavedInstanceActivity : AppCompatActivity() {

    private var count by Delegates.observable(0) { _, _, _ ->
        tvText.text = count.toString()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_saved_instance)

        imgPlus.setOnClickListener {
            count = min(count + 1, 10)
        }

        imgMinus.setOnClickListener {
            count = max(count - 1, 0)
        }

        if (savedInstanceState != null) {
            count = savedInstanceState.getInt("int", 0)
        }
    }

    //...
}

至于您的具体问题,正如其他答案所提到的,这是因为您试图转换文本,而没有安全地检查文本是否可以作为Int进行解析,并且如果文本为空则不能。使用toIntOrNull()更安全,它会给您一个Int 以在文本无效时使用,而不是引发异常。

隗新霁
2023-03-14

您正在使用tvText.toString(). toInt()它应该是tvText.text.toString(). toInt()。在将文本解析为Int之前,您还需要检查文本是否为空。请参阅下面的代码我做了一些修改。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_second)
    imgPlus.setOnClickListener {
        if (tvText.text.toString().isNotEmpty() && tvText.text.toString().toInt() >= 10)
            tvText.text = "10"
        else
            tvText.text = tvText.text.toString().toInt().plus(1).toString()
    }

    imgMinus.setOnClickListener {
        if (tvText.text.toString().isNotEmpty() && tvText.text.toString().toInt() <= 0)
            tvText.text = "0"
        else
            tvText.text = tvText.text.toString().toInt().minus(1).toString()
    }

    if (savedInstanceState != null) {
        val count = savedInstanceState.getInt("int", 0)
        tvText.text = count.toString()
    }
}

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    if(tvText.text.toString().isNotEmpty())
    outState.putInt("int", tvText.text.toString().toInt())
}
慕迪
2023-03-14

您试图将textview转换为字符串而不是文本

像beklow一样尝试。。。

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putInt("int", tvText.text.toString().toInt()) 
    Log.d("saved", tvText.toString())
}
 类似资料:
  • 以下代码禁止使用403,尽管“https://jsonplaceholder.typicode.com/posts/1”在postman中有效 错误: 如果有人能建议,我需要在代码中添加什么

  • 我有一串喜欢的 我想得到的数字只从这个字符串喜欢 我如何使用JavaScript得到这个?谢谢:)

  • 我有一份产品清单 我的产品类别是 我想要两个列表:第一个只返回多次出现的产品,第二个只返回一次出现的产品 我正在使用Java8中的流 但ProductMorethance不会返回重复的产品= 最好的方法是什么?

  • 本文向大家介绍JavaScript中获取纯正的undefined的方法,包括了JavaScript中获取纯正的undefined的方法的使用技巧和注意事项,需要的朋友参考一下 1、为什么要获取undefined? 因为undefined在javascript中不是保留字,可以被用户当做变量来赋值,这样如果我们后期需要用到undefined来检测一个变量的话,那么检测的值就不准确了; 举个栗子: s

  • 我的目标是对名单上的人进行排序。我使用比较器接口的比较方法。 我已经创建了三个类。即 Person类是一个简单的类,包含两个字段(name、age),也包含getters。然后,在我的AgeComaparator类中,我实现了比较器接口,并将Person类作为类型参数传递。 ageComparator.java 排序Example.java 我将Eclipse IDE用于此应用程序,在

  • 在我的Android应用程序,我想得到用户的当前位置每隔几分钟间隔和更新到我的中心服务器使用网络服务。目前我正在使用融合位置提供获取用户当前位置,请参阅链接 现在我想知道频繁获取用户位置和调用web服务的最佳方法是什么。 下面是我的代码,它为我提供了用户当前位置:- 现在从这里我必须调用这个代码。我可以在后台服务或其他地方使用它吗。 请提供你的想法。 蒂亚。