![](/img/trans.png)
[英]How do I save my inputted edit text and have it accessible when starting a new intent?
[英]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()
}
}
}
額外的
onActivityResult
將很快在 API 30 中被棄用,最好你可以學習ActivityResultContract
databinding
,因為它有助於減少許多樣板,因為您使用的是 kotlin。MVVM architecture
,因為它對您開發 Android 應用程序有很大幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.