【问题标题】:OnActivityResult not getting called in Fragment from ActivityOnActivityResult 没有在 Activity 的 Fragment 中被调用
【发布时间】:2019-07-20 21:12:06
【问题描述】:

我的活动流程是这样的。

FragmentA 中,它允许用户捕获图像,图像将显示在Activity B 上供用户进行编辑。

片段 A

mImageListAdapter.mAddImageClickListener = object : ImageListAdapter.AddImageClickListener {
            override fun addImageClicked() {
                val options = arrayOf<CharSequence>("Take Photo", "Choose From Gallery", "Cancel")
                val builder = android.support.v7.app.AlertDialog.Builder(activity)
                builder.setTitle("Select Option")
                builder.setItems(options) { dialog, item ->
                    if (options[item] == "Take Photo") {
                        dialog.dismiss()
                        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                        startActivityForResult(intent, CAMERA_CAPTURE)
                    } 
                }
                builder.show()
            }
        }

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        var bitmap: Bitmap? = null
        if (requestCode == CAMERA_CAPTURE && resultCode == Activity.RESULT_OK) {
            val extras = data?.extras
            if (extras != null) {
                bitmap = extras.get("data") as Bitmap
                val intent = Intent(activity, ActivityB::class.java)
                intent.putExtra("bitmap", bitmap)
                startActivityForResult(intent, 12)
            }
        } else if (requestCode == 12 && resultCode == Activity.RESULT_OK) {
            longToast("It get result from Activity B")
        } else {
            longToast("Nothing")
        }
    }

在Activity B中,一旦点击完成按钮,编辑后的图像会返回到片段A,我预计会显示“It get result from Activity B”,但什么都没有显示

活动 B

doneBtn.setOnClickListener {
            image.buildDrawingCache()
            val bitmap = image.getDrawingCache()
            val resultIntent = Intent()
            resultIntent.putExtra("bitmap", bitmap)
            setResult(Activity.RESULT_OK, resultIntent)
            finish()
        }

【问题讨论】:

  • 尝试从所有地方删除该行intent.putExtra("bitmap", bitmap) 并查看日志longToast("It get the result from Activity B")。如果出现日志消息“It get the result from Activity B”,那么问题是位图参数对于 Bundle 来说太大了。或者尝试在您的主机片段活动中登录活动结果。
  • @SergeyBukarev 你说得对,我现在得到了 Toast,但是如何传递位图?
  • 通过静态变量传递它或将位图保存到文件并从包传递文件名。 Bundle 参数有大小限制。
  • @SergeyBukarev 让我试试

标签: android android-fragments android-activity kotlin onactivityresult


【解决方案1】:

作为最简单的选项之一,通过静态变量传递它

在Fragment A中创建一个静态字段

    companion object {
        public var globalBitmap: Bitmap? = null
    }

并在onActivityResult方法的片段A中将位图保存到静态变量中

...
    if (requestCode == CAMERA_CAPTURE && resultCode == Activity.RESULT_OK) {
                val extras = data?.extras
                if (extras != null) {
                    globalBitmap = extras.get("data") as Bitmap

                    startActivityForResult(intent, 12)
                }
            }
...

在Activity B中从Fragment A中读取结果位图这样的静态变量

FragmentA.globalBitmap

【讨论】:

    【解决方案2】:

    看到我快速尝试并添加了一个断点,并在片段中收到了回调。

    use 上下文

     val builder = android.support.v7.app.AlertDialog.Builder(context)
    

    而不是活动

     val builder = android.support.v7.app.AlertDialog.Builder(activity)
    

    【讨论】:

    • 你能解释一下你的回答有什么帮助吗?
    • 您正在传递一个活动作为 alertdialog 的引用,因此对话框将在 FragmentActivity 上运行。并且请求的任何结果都将发送到活动而不是您请求的位置。使用上下文对 startActivityForResult 更友好。它将结果分派给调用上下文。
    • OnActivityResult 没有被调用是因为参数位图太大。
    • 您是否尝试过捕获图像并将其显示在下一个 Activity 上,然后再次调用 onActivityResult ?
    • 我认为你的做法是错误的。首先,捕获图像,一旦你在 onActivityResult 中获得一个 URI,如果你愿意,尝试在另一个活动中打开它以显示。否则,相机意图将已经显示并请求接受或拒绝使用捕获的图像。
    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 2012-02-08
    • 2016-10-22
    • 2019-03-31
    • 2014-08-26
    相关资源
    最近更新 更多