使用putextra将parcelable对象从子活动传递到primary

问题描述 投票:0回答:1

出于学习目的,我正在尝试执行以下操作:

我想学习如何更新辅助类中的对象列表。

我知道一个可分割的对象比一个序列化的对象更高效,我想这样做

我在我的主要活动中有一个可变的<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 object android-activity kotlin parcelable
1个回答
0
投票

要从另一个活动开始和接收数据,您应该在Android中使用startActivityForResult方法。

我激活了。

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()
}
© www.soinside.com 2019 - 2024. All rights reserved.