使用 Seekbar 在不丢失数据的情况下处理屏幕旋转进度 - Android Kotlin

Handle screen rotation progress without losing data by using Seekbar - Android Kotlin

我是 android studio 的新手,我在旋转屏幕时遇到问题,搜索栏进度将重置为 0,我曾尝试使用保存的实例状态,但进度仍然重置它,谁能帮我提供一些解决方案?

我收到此错误 类型不匹配:推断类型为字符串?但预期 Int

谢谢大家,希望你们早点回来

以上是MainActivity.kt

处的代码
//the bottom one
var no:Int=0
private val SEEKBAR ="seekbar"

//Inside the onCreate
    if (savedInstanceState !=null)       {
        val value = savedInstanceState.getString(SEEKBAR)
        seekbar1.progress=value
        no= value?.toInt() ?:0
    }

//after the onCreate
override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)

val seekbar1 = seekbar1.progress.toString()
outState.putString(SEEKBAR,seekbar1)
}

您正在将字符串传递给搜索栏的进度函数。 我们需要传递整数。 所以,只需使用 seekbar_weight.progress = value.toInt()

完成代码后的更新:

在您的代码中,在 setVariable() 函数中,您根据用户选择的单位设置一些 UI。

在执行此操作时,您将搜索栏的进度设置为 0。并且在从 onRestoreInstateState 恢复进度值后调用此函数。恢复后,您再次从 setVariable() 函数将其设置回零。

因此,您只需要从 setVariable() 函数中删除 8 行(用于设置搜索栏进度和显示搜索栏进度的文本)。

因此,您的 setVariable() 函数应如下所示:

    private fun setVariable() {
    //Set the text of units and the max progress
    spinner_units.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
        override fun onItemSelected(
            parent: AdapterView<*>?,
            view: View?,
            position: Int,
            id: Long
        ) {
            if (position == 0) {
                text_weight.text = "Weight (kg)"
                text_height.text = "Height (cm)"
                seekbar_weight.max = 450
                seekbar_height.max = 250
                number_picker_age.value = 2
                bmi_meter.speedTo(0F)
            } else if (position == 1) {
                text_weight.text = "Weight (ibs)"
                text_height.text = "Height (in)"
                seekbar_weight.max = 770
                seekbar_height.max = 80
                number_picker_age.value = 2
                bmi_meter.speedTo(0F)
            }

        }
        override fun onNothingSelected(parent: AdapterView<*>?) {
        }
    }
}

更新 2:更新请求后UIREMENT

对于您更新后的要求,您可以访问: 恢复从 setVariable() 方法中删除的那 8 行。

在您的 strings.xml 文件中,在微调器的字符串数组中添加一项 'Select'。

<string-array name="units">
        <item>Select</item>
        <item>Metric</item>
        <item>Imperial</item>
</string-array>

MainActivity 中,覆盖 onPause() 方法并将微调器设置到位置 0。

override fun onPause() {
    super.onPause()
    spinner_units.setSelection(0)
}

这应该可以解决您的问题。如果不满意请回复。

尝试 onRestoreInstanceState 怎么样,它仅在 onSaveInstanceState 方法中保存了某些内容且 returns 非空时触发。

但是您需要使用 putInt() 而不是 putString() 因为 SeekBar 的值是 Integer

 override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        val seekbar1 = seekBar1.progress

        //use putInt() method 
        outState.putInt(SEEKBAR, seekbar1)
    }


    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)

        //retrieve value using getInt() method
        val value = savedInstanceState.getInt(SEEKBAR)
        seekBar1.progress = value

    }

告诉我们进展如何。

干杯。

已检查您的代码并按照承诺进行了调试。

问题

每次旋转 phone 时都会重新创建您的 activity。

这会触发 onCreate() 每次调用这行代码。

setReferences()//Setup Gui Components

setReferences() 是让一切都被重置并 归零的那个

解决方案

转到您的清单文件并添加这行代码。

android:configChanges="orientation|screenSize|screenLayout|keyboardHidden">

已为您提供下图...

这将阻止您的 activity 每次轮换时都重新创建,并且 setReferences() 只会被调用一次。

接下来删除这两个函数 onSaveInstanceStateonRestoreInstanceState,因为您不再需要它们。