java - 在 Android studio : Kotlin 中保存实例状态

标签 java android android-studio kotlin onsaveinstancestate

我正在执行此程序并尝试运行一个应用程序作为输出。但是,当我将应用程序转为横向模式时,我的文本输出不起作用。我意识到我需要在 Kotlin 代码中添加 onSaveInstanceState,但我不知道该怎么做。

主要 Activity .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)
    }
}

View 模型实现:

在你的 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()
        }
    }
}

关于java - 在 Android studio : Kotlin 中保存实例状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63701251/

相关文章:

java - "finalizer guardian"在 Java 中如何工作?

java - 如何在android中显示警报时检测搜索按钮

java - 从文本文件读取字符串值到 Java 中的 java arraylist

android - 让安卓手机冒充蓝牙输入设备(鼠标或键盘)

git - CreateProcess error = 2,系统找不到指定的文件错误

android - 我在android studio中遇到了这个问题。我已经下载了链接中提到的文件,并将其粘贴到哪里

java - setOnClickListener 显示错误

c# - Xamarin 表单和 Android 蓝牙

java - 关于 Zxing for Android 的问题

android - 使用 Android Studio 3.0 运行 ionic cordova run android 时出现问题