簡體   English   中英

使用putextra將可拆分對象從子活動傳遞到主要活動

[英]Passing a parcelable object from child activity to primary using putextra

出於學習目的,我嘗試執行以下操作:

我想學習如何從輔助類更新對象列表。

我知道,可包裹對象比序列化對象的性能更高,我想這樣做

我的主要活動中有一個<entry>類的可變列表。 我要執行的操作是更新此列表,添加一個使用putextra方法接收到的新對象

    //from here I gather my fields
    val i = Intent(this, NewEntry::class.java)

    //I try to get my new object
    val entry: Entry = i.getParcelableExtra("new")

    entryList.add(entry)                     //update list

創建對象的輔助活動由主活動中的onclick偵聽器觸發

然后另一個onclick監聽器將我帶回到主要活動

val i = Intent(this, MainActivity::class.java)

    btnAdd.setOnClickListener {
        //intent.putExtra("name", etName.text.toString())
        //intent.putExtra("description", etDescription.text.toString())
        //intent.putExtra("id", etId.text.toString().toInt())
        val name: String = etName.text.toString()
        val description: String = etDescription.text.toString()
        val id: Int = etId.text.toString().toInt()
        val entry = Entry(name, description, id)
        i.putExtra("new", entry)
    }

我留下注釋后的代碼以幫助您了解我已經嘗試過的內容。

該應用程序立即崩潰,我得到的錯誤是

java.lang.IllegalStateException: intent.getParcelableExtra("new") must not be null

我認為在onCreate上putExtra沒有提供任何東西,或者我試圖以一種錯誤的方式來逆轉該過程。 所以問題是:如何從輔助活動中創建該對象,返回主對象並查看我的列表已更新?

要啟動和接收來自另一個活動的數據,您應該在Android中使用startActivityForResult方法。

MainActivity.kt

class MainActivity : AppCompatActivity() {

    companion object {
        val REQUEST_CODE_NEW_ENTRY = 1
    }

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

        // Start EntryActivity
        val i = Intent(this, NewEntry::class.java)
        startActivityForResult(i, REQUEST_CODE_NEW_ENTRY)
    }

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

        // Receive data from EntryActivity
        if (requestCode == REQUEST_CODE_NEW_ENTRY) {
            if (resultCode == Activity.RESULT_OK) {
                val entry: Entry? = data?.getParcelableExtra("new")
                entryList.add(entry!!)
            }
        }
    }
}

NewEntry.kt

btnAdd.setOnClickListener {
      //intent.putExtra("name", etName.text.toString())
      //intent.putExtra("description", etDescription.text.toString())
      //intent.putExtra("id", etId.text.toString().toInt())
      val name: String = etName.text.toString()
      val description: String = etDescription.text.toString()
      val id: Int = etId.text.toString().toInt()
      val entry = Entry(name, description, id)

      // Send entry back to MainActivity
      val intent = Intent().apply { putExtra("new", entry) }
      setResult(Activity.RESULT_OK, intent)

      // Finish current activity
      finish()
}

暫無
暫無

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

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