簡體   English   中英

如何從另一個活動中獲取活動中的變量並在從那里初始化后使主要活動使用變量?(kotlin)

[英]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)

    }

}}

如果您想從用於啟動ActivityIntent中提取數據,只需在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 ,它們允許共享ActivityFragments也共享中央數據存儲並對更改做出反應。

看起來您已經在使用ViewModel ,但是通過共享 Activity 您可以讓您的AddPlayer片段執行類似model.addUser(name, number)的操作。 如果您願意,該模型可以存儲該新用戶(例如,在數據庫中,或 SharedPreferences 或其他)並更新它使可見的數據。 MainFragment可以observe該數據並根據需要更新其顯示

以這種方式做事更容易推理,您無需擔心 Activity 狀態等(創建ViewModel的部分原因是為您處理了很多工作)而且它更現代編寫Android應用程序的方法。 可能值得研究!

暫無
暫無

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

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