我正在 Android Studio 中制作一个简单的笔记应用程序,并通过 Bundle 将 Note 对象传递给我的第二个 Activity,一切正常。然而,对该 Note 对象所做的更改不会反映在原始对象上,因为我假设当它被打包时它会创建一个新的引用(我对 Android Studio 还是新手,所以我不确定)。
override fun onItemClick(note: Note) {
val intent = Intent(this@MainActivity, NoteViewActivity::class.java)
val bundle = Bundle()
bundle.putParcelable("note", note)
intent.putExtras(bundle)
// val startForResult = registerForActivityResult(
// ActivityResultContracts.StartActivityForResult()
// ) { result: ActivityResult ->
// Log.d("result", "result was reached by contract")
// if (result.resultCode == Activity.RESULT_OK) {
// Log.d("result", "result was reached by contract")
// val data: Intent? = result.data
// }
// }
//
// startForResult.launch(intent)
startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
Log.d("ACTIVResult", "ActivityResult was called")
}
}
在我的第二个活动中,我编写的代码如下:
class NoteViewActivity: AppCompatActivity() {
private var note: Note? = null
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> {
saveChangeAndFinish()
return true
}
}
return super.onOptionsItemSelected(item)
}
fun saveChangeAndFinish() {
val resultIntent = Intent()
// resultIntent.putExtra("updatedNote", note)
resultIntent.putExtra("test", "test")
setResult(RESULT_OK, resultIntent)
Log.d("resultIntentV2", resultIntent.extras.toString())
finish()
}
}
我已经尝试了 startActivityForResult() <- which is deprecated -> 和使用 register(...) 的新方法,正如我在上面注释的那样。 我开始怀疑我的清单中是否有一些奇怪的设置或其他什么,我不知道.. 我已经尝试解决这个问题一个多小时了,但没有成功。?
除了寻求帮助之外,我似乎已经用尽了所有可能的解决方案路线,我查看了 StackOverflow 和网络上的旧论坛帖子。
我发现问题了。 在类的顶层,作为实例变量,我创建了一个覆盖该函数的 itemClickListener 对象,并且活动是基于该对象的函数而不是代码中的函数启动的。由于第一个使用了 startActivity(),因此无法触发 onActivityResult()。
编码这么长时间后,我犯了一个愚蠢的错误。为了解决这个问题,我现在在 onCreate() 中创建了 registerForActivityResult() 对象,然后创建了 clicklistener 对象:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val startForResult = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result: ActivityResult ->
Log.d("result", "result was reached by contract")
if (result.resultCode == Activity.RESULT_OK) {
Log.d("result", "result was reached by contract")
val data: Intent? = result.data
}
}
val itemClickListener = object : OnItemClickListener {
override fun onItemClick(note: Note) {
val intent = Intent(this@MainActivity, NoteViewActivity::class.java)
val bundle = Bundle()
bundle.putParcelable("note", note)
intent.putExtras(bundle)
startForResult.launch(intent)
}
}