使用putextra将可拆分对象从子活动传递到主要活动

时间:2018-09-13 00:10:48

标签: android object android-activity kotlin parcelable

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

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

我知道一个可包裹对象比序列化对象的性能更高,我想这样做

我的主要活动中有<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没有任何作用,或者我试图以一种错误的方式撤消该过程。 所以问题是:如何从辅助活动中创建该对象,返回主对象并查看我的列表已更新?

1 个答案:

答案 0 :(得分:0)

要启动和接收来自其他活动的数据,应在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()
}