OnActivityResult 方法已弃用,如何使用菜单的 onOptionItemselected 中的 registerForActivityResult

OnActivityResult method is deprecated, how do I use registerForActivityResult from a Menu's onOptionItemselected

我正在使用 Kotlin。我一直在尝试选择一个文件夹以在其中创建文件并将数据从我的数据库导出到所述文件中。但现在它告诉我,startActivityForResult 已被弃用

我读过问题: ,但遗憾的是,我看不到如何在选项菜单中实现它,以打开 Action_Create_Document 进行数据导出。

作为非母语人士,我在理解基础训练方面也遇到了一些麻烦: https://developer.android.com/training/basics/intents/result
所以我的问题是:如何实现一个调用来选择一个位置并创建一个 txt 文件,并使用所述文件位置用文本填充它,使用 registerForActivityResult 而不移动到另一个Activity/with 留在 Activity 你是。

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.Export -> {
            val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)

            intent.addCategory(Intent.CATEGORY_OPENABLE)
            intent.type = "text/plain"
            intent.putExtra(Intent.EXTRA_TITLE, "Spells.txt")

            startActivityForResult(intent, 112)
            return true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

    override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
    super.onActivityResult(requestCode, resultCode, resultData)
    if (requestCode == 112 && resultCode == RESULT_OK) {
        Toast.makeText(this, "Created", Toast.LENGTH_LONG).show()
        val path = resultData?.data?.path
        val myfile: File
        if (path != null) {
            myfile = File(path)
            ....
            doing stuff()
        }
    }
}

我发现了我思考中的问题。我只需要使用之前创建的 Intent 来启动 resultLauncher,而不是 Activity-changing Intent。

此外,我发现,显示的 Value val resultLauncher 必须在 class 内但在其他函数之外声明,这是我感到困惑的部分。猜猜我被常规蒙蔽了双眼,应该多休息一下

这里有一些关于如何使用新的 registerForActivityResult 方法的代码,在本例中它取代了 Intent.ACTION_CREATE_DOCUMENT 意图。

 class YourActivity {
       // This is the launcher ...
       // CreateDocument() -> Intent.ACTION_CREATE_DOCUMENT
  
       private val getCreateFileUriContent = registerForActivityResult(ActivityResultContracts.CreateDocument()) { uri: Uri? ->
            // Handle the returned Uri
            uri?.let { onCreateFileSelected(it) }
            
            
      override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)        
            //....
            
             someButton.setOnClickListener {
                //launch for results
                getCreateFileUriContent.launch("test.json")
            }
      }     
            
    }