出于学习目的,我正在尝试执行以下操作:
我想学习如何更新辅助类中的对象列表。
我知道一个可分割的对象比一个序列化的对象更高效,我想这样做
我在我的主要活动中有一个可变的<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方法。
我激活了。
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()
}