java - 在 Android Studio 中保存实例状态:Kotlin
问题描述
我正在执行此程序并尝试将应用程序作为输出运行。但是,当我在横向模式下打开应用程序时,我的文本输出不起作用。我意识到我需要添加onSaveInstanceState
我不知道该怎么做的 Kotlin 代码。
MainActivity.kt:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var count = 10
val textCount = findViewById<View>(R.id.textView) as TextView
val buttonred = findViewById<View>(R.id.injury) as Button
val buttoning = findViewById<View>(R.id.vial) as Button
buttonred.setOnClickListener {
if (count >= 0) {
count--
textCount.text = count.toString()
}
}
buttoning.setOnClickListener {
if (count <= 10)
count += 3
textCount.text = count.toString()
}
}
}
XML 代码
LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="60dp"
android:layout_height="78dp"
android:layout_marginStart="145dp"
android:layout_marginTop="68dp"
android:layout_marginEnd="145dp"
android:textSize="50dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/injury"
android:layout_width="106dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="150dp"
android:text="injury"
/>
<Button
android:id="@+id/vial"
android:layout_width="197dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="109dp"
android:text="vial" />
</LinearLayout>
我想知道如何添加onSaveInstanceState
解决方案
这是完整的代码,您没有添加很多细节,但这就是示例项目的外观,它可以保存count
然后将其设置为TextView
:
MainActivity.kt
:
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
companion object {
const val COUNT_KEY = "COUNT_KEY" // const key to save/read value from bundle
}
private var count = 0 // count value with setter. It will be easier, You can change this value and don't have to think about setting TextView.text
set(value) {
field = value
txtCount.text = value.toString()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.i("MyTag", "onCreate")
txtCount.text = count.toString()
butIncrement.setOnClickListener {
count++
}
}
override fun onSaveInstanceState(outState: Bundle) { // Here You have to save count value
super.onSaveInstanceState(outState)
Log.i("MyTag", "onSaveInstanceState")
outState.putInt(COUNT_KEY, count)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) { // Here You have to restore count value
super.onRestoreInstanceState(savedInstanceState)
Log.i("MyTag", "onRestoreInstanceState")
count = savedInstanceState.getInt(COUNT_KEY)
}
}
activity_main.xml
:
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/butIncrement"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Increment" />
<TextView
android:id="@+id/txtCount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="40sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
您编辑了问题并添加了更多详细信息,这是完整的 Kotlin 代码,我对其进行了测试,它似乎可以工作。
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
lateinit var textCount: TextView
lateinit var buttonred: Button
lateinit var buttoning: Button
companion object {
const val COUNT_KEY = "COUNT_KEY"
}
private var count = 0
set(value) {
field = value
textCount.text = value.toString()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.i("MyTag", "onCreate")
textCount = findViewById<View>(R.id.textView) as TextView
buttonred = findViewById<View>(R.id.injury) as Button
buttoning = findViewById<View>(R.id.vial) as Button
count = 10
buttonred.setOnClickListener {
if (count >= 0) {
count--
textCount.text = count.toString()
}
}
buttoning.setOnClickListener {
if (count <= 10)
count += 3
textCount.text = count.toString()
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
Log.i("MyTag", "onSaveInstanceState")
outState.putInt(COUNT_KEY, count)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
Log.i("MyTag", "onRestoreInstanceState")
count = savedInstanceState.getInt(COUNT_KEY)
}
}
视图模型实现:
在您的 Gradle (module.app) 文件中添加:
dependencies {
def lifecycle_version = "2.2.0"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
}
MainActivityViewModel 类:
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
internal class MainActivityViewModel : ViewModel() {
private val _count: MutableLiveData<Int> = MutableLiveData()
val count: LiveData<Int>
get() = _count
init {
_count.value = START_VALUE
}
fun increment() {
_count.value = _count.value!! + 1
}
fun decrement() {
_count.value = _count.value!! - 1
}
companion object {
private const val START_VALUE = 10
}
}
MainActivity 类:
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
class MainActivity : AppCompatActivity()
{
private lateinit var viewModel: MainActivityViewModel
lateinit var textCount: TextView
lateinit var butIncrement: Button
lateinit var butDecrement: Button
override fun onCreate(savedInstanceState: Bundle?)
{
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textCount = findViewById<View>(R.id.textView) as TextView
butIncrement = findViewById<View>(R.id.injury) as Button
butDecrement = findViewById<View>(R.id.vial) as Button
viewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)
viewModel.count.observe(this, {
textCount.text = it.toString()
})
butIncrement.setOnClickListener {
viewModel.increment()
}
butDecrement.setOnClickListener {
viewModel.decrement()
}
}
}
推荐阅读
- javascript - 如何重新定义“this”并重用另一个类的方法。多态性
- docker - 如何在高山上安装流星
- jquery - 无法从数组中获取 Math.max,只能从 console.log
- c - 添加两个二进制数字符串 - C
- python - 写入csv文件python的第二列
- ios - 在 UITableView swift 中限制每个部分的单元格选择
- python - ValueError:索引具有重叠的值
- c# - 如何比较两个队列
? - javascript - 为什么没有新道具出现时我的标题组件会重新渲染...?
- laravel - 使用 Postgres 查询在 Laravel 中转换为 LOWER