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

Posted

技术标签:

【中文标题】OnActivityResult 方法已弃用,如何使用菜单的 onOptionItemselected 中的 registerForActivityResult【英文标题】:OnActivityResult method is deprecated, how do I use registerForActivityResult from a Menu's onOptionItemselected 【发布时间】:2021-08-12 07:38:08 【问题描述】:

我正在使用 Kotlin。我一直在尝试选择一个文件夹来在其中创建一个文件并将数据从我的数据库导出到所述文件中。但现在它向我展示了 startActivityForResult 已被弃用 我已阅读问题: OnActivityResult method is deprecated, what is the alternative? ,但遗憾的是,我看不到您将如何在 Optionsmenu 中实现它,以打开 Action_Create_Document 进行数据导出。 作为非母语人士,我在理解基础培训方面也遇到了一些麻烦:https://developer.android.com/training/basics/intents/result。 所以我的问题是:如何实现调用以选择位置并创建 txt 文件并使用所述文件位置来填充文本,并使用 registerForActivityResult 而不移动到另一个活动/留在你的活动上是。

    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()
        
    

【问题讨论】:

这是您要找的吗? developer.android.com/reference/androidx/activity/result/… 【参考方案1】:

我在我的想法中发现了问题。我只需要使用我之前创建的 Intent 来启动上一个问题中显示的 resultLauncher,而不是更改 Activity 的 Intent。

此外,我发现,显示的 Value val resultLauncher 必须在类内部声明,但在其他函数外部声明,这是我感到困惑的部分。我猜我是例行盲了,应该多休息一下

【讨论】:

我遇到了同样的问题,我收到错误消息“LifecycleOwners must call register before they are STARTED”。你能发布你的解决方案吗?【参考方案2】:

这里有一些关于如何使用新的 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")
            
           
            
    

【讨论】:

以上是关于OnActivityResult 方法已弃用,如何使用菜单的 onOptionItemselected 中的 registerForActivityResult的主要内容,如果未能解决你的问题,请参考以下文章

OnActivityResult 方法已弃用,有啥替代方法?

API 29 已弃用“getBitmap”。还有其他代码吗?

如何更改已弃用的 beginSheetForDirectory 方法

我应该如何在 Android 中使用/不使用已弃用的方法

如何正确更新已弃用的 Android BillingFlowParams 方法

如何解决弃用警告“方法 to_hash 已弃用并将在 Rails 5.1 中删除”