从片段启动活动时,onActivityResult()未被调用

27

我在Android中从相册导入图片时遇到了问题,因为onActivityResult()方法从未被调用。

这是我编写的代码(从片段而不是活动中调用):

Intent galleryIntent = new Intent(Intent.ACTION_PICK,  android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
getActivity().startActivityForResult(galleryIntent, PICK_IMAGE);

顺便提一下,我已经定义了onActivityResult(),但它从未被触发:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult"); // not printed
}

这有什么问题吗?

谢谢!


3
添加构造函数,使用super.onActivityResult(requestCode, resultCode, data)方法。 - Venky
我已经编辑了问题,实际上我的代码已经有那一行了。 - Amokrane Chentir
你需要从相册中选择图片,对吗? - Venky
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null); intent.setType("image/*"); intent.putExtra("return-data", true); startActivityForResult(intent, 1); - Venky
3个回答

112

为了让onActivityResult()在片段中被调用,您应该调用片段的版本startActivityForResult()而不是活动的版本。因此,在您的片段代码中,替换掉

getActivity().startActivityForResult(galleryIntent, PICK_IMAGE);

使用

startActivityForResult(galleryIntent, PICK_IMAGE);

8
将Activities转换为Fragments时犯错误是非常容易的 :-) - Kuffs
2
WOW 成功了 :) 很好,我们在片段中总是使用 getActivity() :) 对我帮助很大 - Javier
1
这应该是正确答案,调用片段内的方法的另一种方法是一种解决方法。 - irwinb
我浪费了一些时间来弄清楚它。感谢您的答案! :) - Damian Walczak

16

使用以下代码:

Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
getActivity().startActivityForResult(galleryIntent, PICK_IMAGE);

onActivityResult方法必须在包含Fragment的Activity中。从那里,你可以调用Fragment的任何方法,但不是在Fragment中调用。

MyFragment myFragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment);
myFragment .onCameraResult(requestCode, resultCode, intent);

在那里可以做任何你想做的事情


1
之前竟然没看到这个!谢谢 :) - Amokrane Chentir

-2
尝试这个代码片段:
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
    intent.setType("image/*");
    intent.putExtra("return-data", true);
    startActivityForResult(intent, 1);


    @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {

        case 1:
            if(requestCode == 1 && data != null && data.getData() != null){
                Uri _uri = data.getData();

                if (_uri != null) {
                    Cursor cursor = getContentResolver().query(_uri, new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, null, null, null);
                    cursor.moveToFirst();
                    final String imageFilePath = cursor.getString(0);
                    File photos= new File(imageFilePath);
                    imageView.setImageBitmap(bitmap);
                    cursor.close();
                }
            }
            super.onActivityResult(requestCode, resultCode, data);
        }
    }   

6
为什么你会两次调用 "super.onActivityResult(requestCode, resultCode, data);" ? - Abdrahmn_msi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接