使用 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()
只会被调用一次。
接下来删除这两个函数 onSaveInstanceState
和 onRestoreInstanceState
,因为您不再需要它们。
我是 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()
只会被调用一次。
接下来删除这两个函数 onSaveInstanceState
和 onRestoreInstanceState
,因为您不再需要它们。