我可以使用什么代替Fragment中的onActivityResult?

时间:2018-09-03 15:21:23

标签: android android-fragments kotlin

Crash我可以代替onActivityResult中的Fragment使用什么? 我在inCreate上使用了这段代码

  

科特琳

photo.setOnClickListener {
            val intent = Intent(Intent.ACTION_PICK)
            intent.type = "image/"
            startActivityForResult(intent, 0)
        }

我想收到这样的结果,但是在片段中

  

科特琳

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == 0 && resultCode == Activity.RESULT_OK && data != null) {
        selectedPhotoUri = data.data
        val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, selectedPhotoUri)
        val bitmapDrawable = BitmapDrawable(bitmap)
        photo.setBackgroundDrawable(bitmapDrawable)
        if (selectedPhotoUri == null) return@onActivityResult
        val filename = UUID.randomUUID().toString()
        val ref = FirebaseStorage.getInstance().getReference("/images/$filename")
        ref.putFile(selectedPhotoUri!!)
                .addOnSuccessListener {
                    ref.downloadUrl.addOnSuccessListener {
                        uri = it.toString()
                    }
                }
                .addOnFailureListener {
                }

    }
}

1 个答案:

答案 0 :(得分:0)

您的堆栈跟踪表明调用photo.setOnClickListenerphoto为空。您的问题与onActivityResult无关,只需在致电photo之前像这样设置photo.setOnClickListener

photo = findViewById(R.id.photo_id);// replace photo_id with id of photo

photo.setOnClickListener {
            val intent = Intent(Intent.ACTION_PICK)
            intent.type = "image/"
            startActivityForResult(intent, 0)
        }

您说:

  

如果我使用Activity NOT片段,则此代码正在运行

首先,您必须从片段中调用startActivityForResult()才能在该片段中接收其结果。

第二次调用startActivityForResult()时先调用Activity的onActivityResult(),然后再调用片段 BUT onActivityResult(),如果您覆盖了onActivityResult()的Activity,没有调用super.onActivityResult()的片段onActivityResult()不会被调用

因此,请勿从活动中覆盖onActivityResult(),或者如果您已覆盖它,并且也希望仅在活动onActivityResult()中调用super.onActivityResult()来调用片段的onActivityResult()


如果您不能采用这种方式,则只需将代码移至片段的可选方法,然后从Activity的onActivityResult调用该方法。