我通过尝试从子 Activity 中返回可打包的数据式类来尝试新的Activity Results API。使用库的Alpha4。
根据我对文档的理解,我已经使用自定义契约(Contract)“AddAttendeeContract”设置了Intent。它会编译并运行,据我所知,正在调用正确的方法,但数据仅为null。
我可能会缺少什么?
class MainActivity : AppCompatActivity() {
...
override fun onCreate(savedInstanceState: Bundle?) {
... //boilerplate setup nonsense
fab.setOnClickListener {
addAttendee()
}
}
private val addAttendee = registerForActivityResult(AddAttendeeContract()) { attendee: AttendeeData? ->
println("Attendee") // this does not print out
println(attendee) // this does not either
}
}
和契约(Contract)
class AddAttendeeContract : ActivityResultContract<Void?, AttendeeData?>() {
override fun createIntent(
context: Context,
input: Void?
): Intent =
Intent(context, AddAttendeeActivity::class.java)
override fun parseResult(
resultCode: Int,
intent: Intent?
): AttendeeData? = when {
resultCode != Activity.RESULT_OK -> null
else -> intent?.getParcelableExtra<AttendeeData>("attendee")
}
}
最后是子 Activity 类中的调用。
class AddAttendeeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
... //boilerplate
add.setOnClickListener { //button on a form
val name: String = view.name.text.toString().trim()
val rate: Double = view.rate.text.toString().trim().toDouble()
val number: Int = view.number.text.toString().trim().toInt()
val intent = Intent(this, MainActivity::class.java).apply {
putExtra("attendee", AttendeeData(name=name, rate=rate, number=number))
}
setResult(Activity.RESULT_OK, intent)
startActivity(intent)
}
}
}
关于发生了什么的任何见解?
最佳答案
解决了。问题在于,第二项 Activity 是一种新的意图,而不是结束并回到原来的意图。
在第二个/子 Activity 中必须更改以下行:startActivity(intent)
至finish()
和一切都按预期工作。
关于android - Activity 结果API返回的数据为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61820347/