【问题标题】:Handling depreciated onActivityResult when calling from Adapter从适配器调用时处理折旧的 onActivityResult
【发布时间】:2021-09-02 06:48:57
【问题描述】:

这可能是一个愚蠢的问题,但我刚刚开始编程并且已经遇到了这个折旧问题。我有一个带有 Recycler View 适配器的活动,并使用了几个请求代码将带有 Intent 的数据从适配器发送到活动。

例如:

在回收站视图中:

val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
        addCategory(Intent.CATEGORY_OPENABLE)
        type = "*/*"}
    activity.startActivityForResult(intent, saveRequestCode)

在活动中:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
        if (requestCode==saveRequestCode&&resultCode == RESULT_OK) {

            if (data != null) {
                uri = data?.data!!
                saveData(uri)
            }
        }
}

从活动中调用时我可以处理折旧

通过声明:

val saveIntent=registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {

            if (result.data != null) {

                uri = result.data?.data!!

                saveData(uri)
            }
        }
    }

并调用意图:

  Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
        addCategory(Intent.CATEGORY_OPENABLE)
        type = "*/*"
      saveIntent.launch(this)

    }
   

但是如何从适配器处理呢?

【问题讨论】:

标签: android-recyclerview onactivityresult registerforactivityresult


【解决方案1】:

由于 registerForActivityResult 需要实现 AppCompatActivity 我无法从适配器调用它,但我可以将 saveIntent 变量作为参数传递给 recyclerView 适配器。 所以,实际上结果证明就像在活动中声明 ActivityResultLauncher 变量一样简单

saveIntent=registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == Activity.RESULT_OK) {
    
                if (result.data != null) {
    
                    uri = result.data?.data!!
    
                    saveData(uri)
                }
            }
        }

并传递给适配器

  adapter=ItemAdapter(list,saveIntent)

在适配器中

class ItemAdapter(private var list: MutableList<Item>,
                   private val saveIntent: ActivityResultLauncher<Intent>,
                 ) :
    RecyclerView.Adapter<ItemAdapter.ItemListViewHolder>() {

   override fun onBindViewHolder(holder: ItemListViewHolder, position: Int) {

        holder.save.setOnClickListener{
  Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
            addCategory(Intent.CATEGORY_OPENABLE)
            type = "*/*"
          
          saveIntent.launch(this)
        }

【讨论】:

    猜你喜欢
    • 2017-06-10
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多