簡體   English   中英

將實例 State 保存在 Android studio: Kotlin

[英]save Instance State in Android studio: Kotlin

我正在執行此程序並嘗試將應用程序作為 output 運行。但是,當我將應用程序轉為橫向模式時,我的文本 output 不起作用。 我意識到我需要在 Kotlin 代碼中添加onSaveInstanceState ,我不知道該怎么做。

主要活動.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 class:

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
    }
}

主要活動 class:

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()
        }
    }
}

您需要覆蓋 onSaveInstanceState 和 onRestoreInstanceState 示例如下

class MainActivity: AppCompatActivity() { private lateinit var resultTv: TextView private var count = 0

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val buttonIncrease = findViewById<Button>(R.id.button_increase)
    val buttonDecrease = findViewById<Button>(R.id.button_decrease)
    resultTv = findViewById(R.id.result)
    buttonIncrease.setOnClickListener { view ->
        updateValue(view.id)
        resultTv.text = "" + count
    }
    buttonDecrease.setOnClickListener { view ->
        updateValue(view.id)
        resultTv.text = "" + count
    }
}

private fun updateValue(id: Int) {
    if (id == R.id.button_increase) {
        if (count < 10) count++
    } else {
        if (count > 0) count--
    }
}

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putInt("count", count)
}

override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
    super.onRestoreInstanceState(savedInstanceState)
    savedInstanceState?.let {
       count = it.get("count") as Int
        resultTv.text = "" + count
    }
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM