簡體   English   中英

開始新意圖時如何保存以前的活動?

[英]How do I save previous activity when starting a new intent?

我有兩個活動。 一個是帶有添加動態按鈕的按鈕的主頁,第二個頁面是兩個編輯文本。 因此,您單擊主頁上的按鈕和 go 到您輸入兩個編輯文本的第二頁,然后您將被發送回主頁,其中創建了一個設置為編輯文本之一的動態按鈕。 我制作了一個充氣機,允許您通過按鈕將 go 重新回到第二個活動,但它會啟動新的第二個活動,因此之前輸入的編輯文本消失了。 我如何讓他們留下來?

主頁:

    package com.example.quest

import android.app.Activity
import android.app.AlertDialog
import android.content.Intent
import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.Gravity
import android.widget.Button
import android.widget.LinearLayout
import androidx.preference.PreferenceManager
import com.google.android.material.floatingactionbutton.FloatingActionButton

class MainActivity : AppCompatActivity() {
    private val questionActivityCode = 2
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        findViewById<FloatingActionButton>(R.id.btn2).setOnClickListener{
            startActivityForResult(Intent(this@MainActivity, SecondActivity::class.java), questionActivityCode)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if (requestCode == questionActivityCode && resultCode == Activity.RESULT_OK) {
            createNewButtonWithText(data?.getStringExtra("test") ?: "")
        }
    }

    private fun createNewButtonWithText(text: String)
    {
        val newbutton = Button(this@MainActivity)
        val layout = findViewById<LinearLayout>(R.id.mainlayout)
        newbutton.text = text
        newbutton.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
        newbutton.width=1010
        newbutton.height=300
        newbutton.gravity = Gravity.CENTER
        newbutton.translationX= 65F
        newbutton.setTextColor(Color.parseColor("#FFFFFFFF"))
        newbutton.setBackgroundColor(Color.parseColor("#250A43"))
        layout.addView(newbutton)

        val inflator = layoutInflater
        val builder = AlertDialog.Builder(this)
        val intent = Intent(this@MainActivity, SecondActivity::class.java)

        newbutton.setOnClickListener{
            val dialogLayout = inflator.inflate(R.layout.text, null)
            with(builder) {
                setTitle(newbutton.text)
                setPositiveButton("Edit"){dialog, which ->
                    startActivity(intent)
                }
                setNegativeButton("Cancel"){dialog, which ->
                    Log.d("Main", "Negative button clicked")
                }
                setView(dialogLayout)
                show()
        }
    }
}}

第二個活動:

    package com.example.quest

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import androidx.preference.PreferenceManager
import com.google.android.material.floatingactionbutton.FloatingActionButton

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val question = findViewById<EditText>(R.id.question)
        val answer = findViewById<EditText>(R.id.answer)

        findViewById<FloatingActionButton>(R.id.btn3).setOnClickListener {
            val questiontext = question.text.toString()
            val answertext = answer.text.toString()
            val sharedPre = PreferenceManager.getDefaultSharedPreferences(this@SecondActivity).edit()
            sharedPre.putString("question", questiontext)
            sharedPre.putString("answer", answertext)
            sharedPre.apply()


            val returnIntent = Intent()
            returnIntent.putExtra("test", questiontext)
            setResult(Activity.RESULT_OK, returnIntent)

            finish()
        }
    }

    }

如果您在創建活動后查看活動生命周期,並且當從一個活動移動到下一個活動時,活動將被銷毀,並創建一個新活動。 保存此數據的一種簡單方法是使用共享首選項,您可以在用戶在第二個活動中輸入數據時存儲數據,並且在膨脹第二個活動之前檢查 sharedprefs 數據是否不是 null 並使用數據更新其他活動只是創建一個新活動。

你在使用 MVVM 架構嗎? 您可能應該將所有值存儲在ViewModel中,並在ViewModel中的活動之間調用這些值,因為 View(活動/片段)僅負責與 UI 相關的任務。

這是一個簡單的例子

共享視圖模型

class SharedViewModel : ViewModel() {

   // ViewModel that holds data-related values
   var question: String ?= null
   var answer: Stirng ?= null   

}

第二活動

class SecondActivity : AppCompatActivity() {

  private val sharedViewModel: SharedViewModel by viewModels() <-- add your viewmodel here

    override fun onCreate(savedInstanceState: Bundle?) {
      
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val question = findViewById<EditText>(R.id.question)
        val answer = findViewById<EditText>(R.id.answer)


        // Step 1 - Check viewmodel's value and assign it back to edittext
        if(sharedViewModel.question != null) {
            question.text = sharedViewModel.question
        } 

        if(sharedViewModel.answer != null) {
            answer.text = sharedViewModel.answer
        }

        // Step 2 - Assign your value into viewmodel
        findViewById<FloatingActionButton>(R.id.btn3).setOnClickListener {

            sharedViewModel.question = question.text.toString()
            sharedViewModel.answer = answer.text.toString()
            
            returnIntent.putExtra("test", questiontext)
            setResult(Activity.RESULT_OK, returnIntent)

            finish()
        }
    }

    }

額外的

  1. onActivityResult將很快在 API 30 中被棄用,最好你可以學習ActivityResultContract
  2. 嘗試使用databinding ,因為它有助於減少許多樣板,因為您使用的是 kotlin。
  3. 嘗試適應MVVM architecture ,因為它對您開發 Android 應用程序有很大幫助。

暫無
暫無

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

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