无论如何都无法调用 onActivityResult()

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

我正在 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 和网络上的旧论坛帖子。

android kotlin android-activity
1个回答
0
投票

我发现问题了。 在类的顶层,作为实例变量,我创建了一个覆盖该函数的 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)
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.