onActivityResult 不会从 viewPager 片段调用

Posted

技术标签:

【中文标题】onActivityResult 不会从 viewPager 片段调用【英文标题】:onActivityResult doesn't call from viewPager fragment 【发布时间】:2015-11-16 08:21:08 【问题描述】:

您好,我在主片段中使用带有片段的 viewPager。 我正在尝试从图库或相机中获取图像到位图,但是在选择照片和 startActivityForResult 后它没有捕获 onActivityResult...

这是我调用 startActivityForResult 的方式:

private void setAvatarDialog()
        final CharSequence[] options = "Choose from Gallery", "Take Photo" ;

        String title = getString(R.string.alertDialog_editProfile_updateAvatar_title);
        String negative = getString(R.string.alertDialog_editProfile_updateAvatar_negative);

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(title);
        builder.setItems(options, new DialogInterface.OnClickListener() 
            @Override
            public void onClick(DialogInterface dialog, int which) 
                if (options[which].equals(options[0])) 
                    mIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    mIntent.setType("image/*");
                    startActivityForResult(Intent.createChooser(mIntent, "Select File"), SELECT_FILE);
                 else if (options[which].equals(options[1])) 
                    mIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(mIntent, REQUEST_CAMERA);
                
                dialog.dismiss();
            
        );
        builder.setNegativeButton(negative, new DialogInterface.OnClickListener() 
            @Override
            public void onClick(DialogInterface dialog, int which) 
                dialog.dismiss();
            
        );
        builder.show();
    

这是我的 onActivityResult:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK)
            if (requestCode == REQUEST_CAMERA)
                resultCamera(data);
             else if (requestCode == SELECT_FILE) 
                resultGallery(data);
            
        
    

有什么想法吗?

【问题讨论】:

您是否确保您的活动返回结果?代码未显示.. 你的意思是我需要在activity中覆盖onActivity结果? 【参考方案1】:

当我有一个包含具有 3 个不同片段(子)的 ViewPager 并且其中一个子片段开始活动的 ParentFragment 时,此解决方案对我有用。

您可以使用getParentFragment().startActivityForResult在孩子中打开活动

一旦该活动完成,它将在 ParentFragment 中调用 onActivityResult,我在其中重写方法来调用 3 个孩子的 onActivityResult 中的每一个@

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    for (Fragment fragment : getChildFragmentManager().getFragments()) 
        fragment.onActivityResult(requestCode, resultCode, data);
    

【讨论】:

【参考方案2】:

您需要确保为结果而启动的活动也返回结果。例如,在您的图像捕获Activity 中,Activity 结束的地方,包括

    Intent intent = new Intent();
    //intent.putExtra
    intent.putExtra(getString(R.string.MY_RESULT_CODE), data);
    setResult(RESULT_OK, intent);
    finish(); //Ends the current activity. 
    //After this, onActivityResult of the activity that started this one will be called

【讨论】:

我正在使用本教程从图库和相机中获取图像。 theappguruz.com/blog/… 当我在一个片段中使用它时 - 它可以工作,但是当有带有片段的 viewPager 时它不工作【参考方案3】:

查看https://***.com/a/24303360/3207339

都表示ViewPager中的Fragment有问题,我也有同样的问题。

【讨论】:

【参考方案4】:

这对我有用。

// Parent Fragment
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    getTargetFragment().onActivityResult(requestCode, resultCode, data);


// In Child Fragment
public void pick() 
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);

        // Note followings two lines.
        getParentFragment().startActivityForResult(Intent.createChooser(intent, "Select"), 1);
        getParentFragment().setTargetFragment(this,1);


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);
        Log.d("DEBUG","ONE1");
        if (requestCode == PICK_IMAGE_REQUEST && resultCode == Activity.RESULT_OK && data != null && data.getData() != null) 
            Log.d("DEBUG","TWO");
            Uri uri = data.getData();
            try 
                Log.d("DEBUG","THREE");
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContext().getContentResolver(), uri);
                // Log.d(TAG, String.valueOf(bitmap));
                Log.d("DEBUG","FOUR");
                ImageView imageView = (ImageView) yourLayoutView.findViewById(R.id.yourImageView);
                Log.d("DEBUG","FIVE");
                imageView.setImageBitmap(bitmap);
                Log.d("DEBUG", "SIX");
             catch (Exception e) 
                e.printStackTrace();
            
        

【讨论】:

以上是关于onActivityResult 不会从 viewPager 片段调用的主要内容,如果未能解决你的问题,请参考以下文章

从Fragment调用startActivityForResult不会调用onActivityResult

从 Fragment 开始ActivityForResult() 并完成子 Activity,不会在 Fragment 中调用 onActivityResult()

Android Photo Gallery不会从OnActivityResult中的数据返回正确的Uri

[从Google Play商店安装应用时的onActivityResult回调

ActivityResultCallback 函数 onActivityResult 不会在某些设备上触发(Android Studio / Java)

OnActivityResult Fragment 中的方法已执行,但 View 中没有发生任何事情