[英]how to get a variable in an activity from another activity and make the main activity to use variable after initializing from there ?(kotlin )
我的 kotlin 項目有 2 個活動(主要,第二個稱為:AddPlayer)主要活動有一個名為“添加播放器”的按鈕,它開始第二個活動。 在第二個活動中,我有 2 個編輯文本以從用戶那里獲取數字和文本。 在第二個活動中按下提交按鈕后,在主要活動中,我想將這些值添加到我的可變列表中,但我不知道該怎么做(我認為它崩潰了,因為主要活動在從用戶獲取值之前使用了這些變量)請指導我。
我的活動代碼:
class MainActivity : AppCompatActivity() {
private var enteredPlayerNumber = 0
private var enteredPlayerName: String=""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val myRecyclerView = findViewById<RecyclerView>(R.id.recyclerView)
val myViewModel = ViewModel()
val btnAdd = findViewById<Button>(R.id.btnAdd)
myRecyclerView.layoutManager = LinearLayoutManager(this)
myViewModel.getUserData()
btnAdd.setOnClickListener {
val myIntent = Intent(this, AddPlayerActivity::class.java)
startActivity(myIntent)
}
myViewModel.myList.observe(this) {
myRecyclerView.adapter = MyAdapter(it)
}
}}
我的第二個活動:
class AddPlayerActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_add_player)
val numberAddPlayer = findViewById<EditText>(R.id.etNumberAdd2)
val nameAddPlayer = findViewById<EditText>(R.id.etNameAdd2)
val btn = findViewById<Button>(R.id.btnSubmitAdd2)
btn.setOnClickListener {
val myIntent=Intent(this,MainActivity::class.java)
myIntent.putExtra("USERNAME", nameAddPlayer.text)
myIntent.putExtra("USER_NUMBER", numberAddPlayer.text)
startActivity(myIntent)
}
}}
如果您想從用於啟動Activity
的Intent
中提取數據,只需在onCreate
中執行此操作:
intent?.run {
val userName = getStringExtra("USERNAME")
val userNumber = getStringExtra("USER_NUMBER")
if (username != null && userNumber != null {
// do whatever with that data
}
}
您需要進行空值檢查,因為這些值可能不存在,例如,如果MainActivity
是通過啟動應用程序啟動的,而不是通過單擊AddPlayerActivity
中的按鈕。
此外,如果您單擊按鈕並返回MainActivity
,並將應用程序置於后台並被銷毀,當它重新創建時onCreate
將再次運行,看到相同的intent
(最后一個在重新創建狀態時被保留)和它會提取值並再次對它們進行處理。 如果這意味着將某些內容添加到列表中,您可能會得到重復項
避免這種情況的一種方法是檢查savedInstanceState
是否為空- 如果是,您將進入活動新鮮,因此可以檢查意圖。 如果它不是null ,那么您正在從已經打開的活動中重新創建一些已保存的狀態,因此您不想重復檢查
override fun onCreate(savedInstanceState: Bundle?) {
...
if (savedInstanceState == null) {
// do the intent stuff
}
但這可能取決於您對 Activity 和任務 backstack 所做的事情 - 對其進行測試以確保它按照您的預期進行!
Android 開發人員在這一點上推薦的方法是單 Activity 架構,其中不是每個屏幕都有一個Activity
,而是只有一個,並使用Fragment
s 作為屏幕並將它們換入和換出。
許多Jetpack組件都是圍繞這個想法設計的,包括Navigation庫和ViewModel ,它們允許共享Activity
的Fragments
也共享中央數據存儲並對更改做出反應。
看起來您已經在使用ViewModel
,但是通過共享 Activity 您可以讓您的AddPlayer
片段執行類似model.addUser(name, number)
的操作。 如果您願意,該模型可以存儲該新用戶(例如,在數據庫中,或 SharedPreferences 或其他)並更新它使可見的數據。 MainFragment
可以observe
該數據並根據需要更新其顯示
以這種方式做事更容易推理,您無需擔心 Activity 狀態等(創建ViewModel
的部分原因是為您處理了很多工作)而且它更現代編寫Android應用程序的方法。 可能值得研究!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.