onActivityResult未在片段中调用

承载此片段的活动在相机活动返回时调用其onActivityResult

我的片段为一个结果启动了一个活动,目的是让相机拍照。图片应用程序加载正常,拍照,然后返回。然而,onActivityResult永远不会被击中。我设置了断点,但什么都没有触发。一个片段可以有onActivityResult吗?我认为可以,因为它是一个提供的函数。为什么没有触发?

ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);myImage.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(cameraIntent, 1888);}});
@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {if( requestCode == 1888 ) {Bitmap photo = (Bitmap) data.getExtras().get("data");((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);}}
489840 次浏览

托管活动覆盖了onActivityResult(),但它没有调用super.onActivityResult()来获取未处理的结果代码。显然,即使片段是进行startActivityForResult()调用的那个,活动也会首先处理结果。当你考虑片段的模块化时,这是有道理的。一旦我为所有未处理的结果实现super.onActivityResult(),片段就有机会处理结果。

同样来自@四清的回答:

要在片段中获取结果,请确保在片段中调用startActivityForResult(intent,111);而不是getActivity().startActivityForResult(intent,111);

添加此

public void onClick(View v) {Intent intent = new Intent(Intent.ACTION_GET_CONTENT,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(intent, 1);}

当您将用上面的代码替换您的代码时,然后自动将您的代码替换为

public void onActivityResult(int requestCode, int resultCode,@Nullable Intent data){}

方法将开始工作

//No Need to write this code in onclick methodIntent intent=new Intent();intent.setType("image/*");intent.setAction(Intent.ACTION_GET_CONTENT)startActivityForResult(intent,1);Toast.makeText(getContext(), "image"+intent, Toast.LENGTH_SHORT).show();

我想你叫了0号。你应该叫1号。

如果有人仍然无法完成,我可以添加两个建议。在Manifest.xml文件中,确保回调时托管活动没有完成,并且要启动的活动标准为启动模式。详情如下:

对于托管活动,如果有,则将无历史属性设置为false

android:noHistory="false"

对于要启动的活动,如果有,请将启动模式设置为标准模式

android:launchMode="standard"
public class takeimage extends Fragment {
private Uri mImageCaptureUri;private static final int PICK_FROM_CAMERA = 1;private static final int PICK_FROM_FILE = 2;private String mPath;private ImageView mImageView;Bitmap bitmap = null;View view;
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {view = inflater.inflate(R.layout.activity_send_image, container, false);final String[] items = new String[] { "From Camera", "From SD Card" };mImageView = (ImageView)view.findViewById(R.id.iv_pic);ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.select_dialog_item, items);AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());builder.setTitle("Select Image");
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int item) {if (item == 0) {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);File file = new File(Environment.getExternalStorageDirectory(), "tmp_avatar_"+ String.valueOf(System.currentTimeMillis())+ ".jpg");mImageCaptureUri = Uri.fromFile(file);
try {intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,mImageCaptureUri);intent.putExtra("return-data", true);
getActivity().startActivityForResult(intent,PICK_FROM_CAMERA);} catch (Exception e) {e.printStackTrace();}
dialog.cancel();} else {Intent intent = new Intent();
intent.setType("image/*");intent.setAction(Intent.ACTION_GET_CONTENT);
getActivity().startActivityForResult(Intent.createChooser(intent,"Complete action using"), PICK_FROM_FILE);}}});final AlertDialog dialog = builder.create();
Button show = (Button) view.findViewById(R.id.btn_choose);show.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// Switch the tab content to display the list view.dialog.show();}});
return view;}
@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK)return;
if (requestCode == PICK_FROM_FILE) {mImageCaptureUri = data.getData();// mPath = getRealPathFromURI(mImageCaptureUri); //from Gallery
if (mPath == null)mPath = mImageCaptureUri.getPath(); // from File Manager
if (mPath != null)bitmap = BitmapFactory.decodeFile(mPath);} else {mPath = mImageCaptureUri.getPath();bitmap = BitmapFactory.decodeFile(mPath);}mImageView.setImageBitmap(bitmap);}
public String getRealPathFromURI(Uri contentUri) {String [] proj = {MediaStore.Images.Media.DATA};Cursor cursor = managedQuery(contentUri, proj, null, null,null);
if (cursor == null) return null;
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);cursor.moveToFirst();return cursor.getString(column_index);}}

我在ChildFragmentManager中遇到了同样的问题。管理器不会将结果传递给嵌套的片段,您必须在基片段中手动执行此操作。

public void onActivityResult(int requestCode, int resultCode, Intent intent) {super.onActivityResult(requestCode, resultCode, intent);Fragment fragment = (Fragment) getChildFragmentManager().findFragmentByTag(childTag);if (fragment != null) {fragment.onActivityResult(requestCode, resultCode, intent);}}

备选案文1:

如果你要从片段中调用startActivityForResult(),那么你应该调用startActivityForResult(),而不是getActivity().startActivityForResult(),因为它会导致片段onActivityResult()。

如果您不确定在哪里调用startActivityForResult()以及如何调用方法。

备选案文2:

由于活动获取onActivityResult()的结果,您需要覆盖活动的onActivityResult()并调用super.onActivityResult()以传播到相应的片段以获取未处理的结果代码或所有代码。

如果上述两个选项不起作用,那么请参阅选项3,因为它肯定会起作用。

备选案文3:

对onActivityResult函数的显式调用如下。

在父活动类中,重写onActivityResult()方法,甚至重写片段类中的相同方法并调用以下代码。

在父类中:

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);fragment.onActivityResult(requestCode, resultCode, data);}

在子类中:

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// In fragment class callback}

我只是做了一个变通方法:

public static Fragment _tempFragment = null;@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if(_tempFragment != null)_tempFragment.onActivityResult(requestCode, resultCode, data);}

在你的片段中,在start ActivityResult之前,设置

MainActivity._tempFragment = this;

在onActivityResult<--在片段之后

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);
// Do your job{
}MainActivity._tempFragment = null;}

如果您不知道活动中的片段,只需枚举它们并发送活动结果参数:

//Java

// In your activity@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);for (Fragment fragment : getSupportFragmentManager().getFragments()) {fragment.onActivityResult(requestCode, resultCode, data);}}

//静态编程语言

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)for (fragment in supportFragmentManager.fragments) {fragment.onActivityResult(requestCode, resultCode, data)}}

这些答案中的大多数都说你必须在你的主机Activity中调用super.onActivityResult(...)来获得你的Fragment。但这似乎对我不起作用。

因此,在您的主机Activity中,您应该调用您的FragmentsonActivityResult(...)。这是一个示例。

public class HostActivity extends Activity {
private MyFragment myFragment;
protected void onActivityResult(...) {super.onActivityResult(...);this.myFragment.onActivityResult(...);}}

在您的HostActivity中的某个时候,您需要将this.myFragment分配给您正在使用的Fragment。或者,使用FragmentManager来获取Fragment,而不是在您的HostActivity中保留对它的引用。此外,在尝试调用this.myFragment.onActivityResult(...);之前检查null

正如Ollie C提到的,当您使用嵌套片段时,支持库使用返回值onActivityResult有一个活动bug。

Fragment.onActivityResult not call的请求代码!=0

原文。

FragmentActivityrequestCode替换为修改后的1。之后,当调用onActivityResult()时,FragmentActivity解析更高的16位并恢复原始片段的索引。看看这个方案:

在此处输入图像描述

如果您在根级别有一些片段,则没有问题。但如果您有嵌套片段,例如Fragment,其中ViewPager中有几个选项卡,则您保证会面临一个问题(或已经面对它)。

因为只有一个索引存储在requestCode中。这是Fragment在其FragmentManager中的索引。当我们使用嵌套片段时,有子FragmentManager,它们有自己的片段列表。因此,有必要从根FragmentManager开始保存整个索引链。

在此处输入图像描述

我们如何解决这个问题?有一个通用的解决方案在这篇文章

GitHub:https://github.com/shamanland/nested-fragment-issue

简而言之,

在片段中,声明Fragment fragment = this

之后使用fragment.startActivityForResult

结果将返回到actiityResult中。

我强烈怀疑这里的所有答案都只不过是黑客攻击。我已经尝试了所有和许多其他方法,但没有任何可靠的结论,因为总会有某种愚蠢的问题。我不能依赖不一致的结果。如果你看看官方的Android API留档碎片,你会看到谷歌明确指出以下内容:

从包含活动的片段调用start ActivityForResult(Intent, int)。

见:安卓碎片接口

因此,最正确和可靠的方法似乎是从托管活动中实际调用为结果启动活动(),并从那里处理生成的onActivityResult()//活动获取//活动获取

您的代码有一个嵌套的片段。调用super.onActivityForResult不起作用

您不希望修改可以从中调用片段的每个活动,或者围绕调用片段链中的每个片段进行工作。

这是许多工作解决方案之一。动态创建一个片段并使用支持片段管理器将其直接连接到活动。然后从新创建的片段调用start ActivityForResult。

private void get_UserEmail() {
if (view == null) {return;}((TextView) view.findViewById(R.id.tvApplicationUserName)).setText("Searching device for user accounts...");
final FragmentManager fragManager = getActivity().getSupportFragmentManager();
Fragment f = new Fragment() {@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);startActivityForResult(AccountPicker.newChooseAccountIntent(null, null,new String[]{"com.google"}, false, null, null, null, null), REQUEST_CODE_PICK_ACCOUNT);}
@Overridepublic void onActivityResult(int requestCode, int resultCode,Intent data) {if (requestCode == REQUEST_CODE_PICK_ACCOUNT) {String mEmail = "";if (resultCode == Activity.RESULT_OK) {if (data.hasExtra(AccountManager.KEY_ACCOUNT_NAME)) {mEmail = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);}}if (mActivity != null) {GoPreferences.putString(mActivity, SettingApplication.USER_EMAIL, mEmail);}doUser();}super.onActivityResult(requestCode, resultCode, data);fragManager.beginTransaction().remove(this).commit();}};FragmentTransaction fragmentTransaction = fragManager.beginTransaction();fragmentTransaction.add(f, "xx" + REQUEST_CODE_PICK_ACCOUNT);fragmentTransaction.commit();}

解决方案1:

调用startActivityForResult(intent, REQUEST_CODE);而不是getActivity().startActivityForResult(intent, REQUEST_CODE);

解决方案2:

startActivityForResult(intent, REQUEST_CODE);被调用时,活动的onActivityResult(requestCode,resultcode,intent)被调用,然后你可以从这里调用fragments onActivityResult(),传递requestCode, resultCode and intent

在你的碎片里,呼唤

this.startActivityForResult(intent, REQUEST_CODE);

其中this指的是片段。否则按照@Clevester说的做:

Fragment fragment = this;....fragment.startActivityForResult(intent, REQUEST_CODE);

我也不得不打电话

super.onActivityResult(requestCode, resultCode, data);

在父活动的onActivityResult中使其工作。

(我改编了@Clevester的答案。

我也在一个片段中遇到了这个问题。我在DialogFragment中调用了startActivityForResult

但是现在这个问题已经解决了:
FragmentClassname.this.startActivityForResult.

只需为片段使用下面的代码。

@Overridepublic void onOtherButtonClick(ActionSheet actionSheet, int index) {
if (index == 1){Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);intent.setType("image/*");startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1);}}
public void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == 1) {if (requestCode == 1) {Uri selectedImageUri = data.getData();//selectedImagePath = getPath(selectedImageUri);}}}

onActivityResult将调用而不调用其父级。

  1. 您可以简单地覆盖片段baseActivity.startActivityForResult上的BaseActiveonActivityResult

  2. 在BaseActive上添加接口并覆盖onActivityResult。

    private OnBaseActivityResult baseActivityResult;public static final int BASE_RESULT_RCODE = 111;public interface OnBaseActivityResult{void onBaseActivityResult(int requestCode, int resultCode, Intent data);}}
    @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if(getBaseActivityResult() !=null && requestCode == BASE_RESULT_RCODE){getBaseActivityResult().onBaseActivityResult(requestCode, resultCode, data);setBaseActivityResult(null);}
  3. On Fragment implements OnBaseActivityResult

    @Overridepublic void onBaseActivityResult(int requestCode, int resultCode, Intent data) {Log.d("RQ","OnBaseActivityResult");if (data != null) {Log.d("RQ","OnBaseActivityResult + Data");Bundle arguments = data.getExtras();}}

This workaround will do the trick.

如果上述问题在facebook登录中遇到,那么您可以在片段的父活动中使用以下代码,例如:

Fragment fragment = getFragmentManager().findFragmentById(android.R.id.tabcontent);fragment.onActivityResult(requestCode, resultCode, data);

或:

Fragment fragment = getFragmentManager().findFragmentById("fragment id here");fragment.onActivityResult(requestCode, resultCode, data);

并在您的片段中添加以下调用…

callbackManager.onActivityResult(requestCode, resultCode, data);

如果您使用嵌套片段,这也有效:

getParentFragment().startActivityForResult(intent, RequestCode);

除此之外,您还必须从父活动调用super.onActivityResult并填充片段的onActivityResult方法。

对于嵌套片段(例如,使用ViewPager时)

在您的主要活动中:

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);}

在您的主要顶级片段(ViewPager片段)中:

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {YourFragment frag = (YourFragment) getChildFragmentManager().getFragments().get(viewPager.getCurrentItem());frag.yourMethod(data);  // Method for callback in YourFragmentsuper.onActivityResult(requestCode, resultCode, data);}

在你的片段(嵌套片段)中:

public void yourMethod(Intent data){// Do whatever you want with your data}

只需拨打:

startActivityForResult(intent, "1");

在我的情况下,它是一个Androidbug(http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-android/),如果你使用支持的FragmentActivity,你必须使用getSupportFragmentManager而不是getChildFragmentManager

List<Fragment> fragments = getSupportFragmentManager().getFragments();if (fragments != null) {for (Fragment fragment : fragments) {if(fragment instanceof UserProfileFragment) {fragment.onActivityResult(requestCode, resultCode, data);}}}

对于许多嵌套片段(例如,在片段中使用ViewPager时)

在你的主要活动

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);}

在你的片段中:

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {for (Fragment fragment : getChildFragmentManager().getFragments()) {fragment.onActivityResult(requestCode, resultCode, data);}}

在你的嵌套片段中

呼叫活动

getParentFragment().startActivityForResult(intent, uniqueInstanceInt);

唯一实例-将其替换为嵌套片段中唯一的int,以防止另一个片段处理答案。

接收响应

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == uniqueInstanceInt ) {// TODO your code}}

注意事项

在uniqueInstance Int中需要使用介于0和65536之间的数字以避免错误“只能使用较低的16位用于请求代码”。

如果片段类中的方法onActivityResult有问题,并且您想更新片段类中的一些东西,请使用:

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == Activity.RESULT_OK){// If the user had agreed to enabling Bluetooth,// populate the ListView with all the paired devices.this.arrayDevice = new ArrayAdapter<String>(this.getContext(), R.layout.device_item);for(BluetoothDevice bd : this.btService.btAdapater.getBondedDevices()){this.arrayDevice.add(bd.getAddress());this.btDeviceList.setAdapter(this.arrayDevice);}}super.onActivityResult(requestCode, resultCode, data);}

只需添加this.variable,如上面的代码所示。否则,该方法将在父活动中调用,并且变量不会更新当前实例。

我还通过将此代码块放入MainActivity、将this替换为HomeFragment类并使变量保持静态来测试它。我得到了我预期的结果。

因此,如果您想让片段类拥有自己的onActivityResult实现,上面的代码示例就是答案。

最简单的方法之一是从你的片段开始一个活动。

startActivity(ActivityName);

然后,从您的活动中添加调用startActivityForResult(intent,"1");并在您的活动中添加onActivityResult

startActivityForResult(intent,"1");
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);fragment.onActivityResult(requestCode, resultCode, data);// perform other activity result like fetching from Uris or handling cursors
finish(); // finish the activity will  get to back to your fragment.}

我的问题是与主机活动我发现它与一组android:launchMode="standard"我删除它临时和它的工作!

有一点没有人有mention,确保您的主机活动启动模式不能设置为singleInstancesingleTask

如果您的启动模式设置为SingleInstance或SingleTask,onActivityResult将不起作用。或者您使用这些IntentFilters调用您的活动

standardsingleTop启动模式将正常工作。

这是最受欢迎的问题之一。我们可以找到很多关于这个问题的线程。但没有一个对我有用。

所以我用这个解决方案解决了这个问题。

让我们首先了解为什么会发生这种情况。

我们可以直接从片段中调用startActivityForResult,但实际上背后的机制都由活动处理。

一旦你从片段调用startActivityForResult,请求代码将被更改为将片段的身份附加到代码中。这将使活动能够在收到结果后跟踪发送此请求的人。

一旦活动被导航回来,结果将被发送到活动的onActivityResult与修改后的请求代码,将被解码为原始请求代码+片段的身份。之后,活动将通过onActivityResult将活动结果发送到该片段。一切都完成了。

问题是:

活动只能将结果发送到直接附加到活动的片段,而不是嵌套的片段。这就是为什么嵌套片段的onActivityResult无论如何都不会被调用的原因。

解决方案:

1)通过以下代码在你的片段中启动意图:

       /** Pass your fragment reference **/frag.startActivityForResult(intent, REQUEST_CODE); // REQUEST_CODE = 12345

2)现在在你的父活动覆盖**#0:**

    @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);}

您必须在父活动中调用它才能使其工作。

3)在你的片段调用中:

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == Activity.RESULT_OK) {
}}

就是这样。有了这个解决方案,它可以应用于任何单个片段,无论它是否嵌套。是的,它也涵盖了所有的情况!此外,代码也很漂亮和干净。

我也面临着同样的问题,一旦我将这块代码从碎片转移到实用类parentActivity作为论点传递,

Intent intent = new Intent(parentActivity, CameraCaptureActivity.class);parentActivity.startActivityForResult(intent,requestCode);

然后我在碎片onActivityResult方法中没有得到任何值,之后,我将论点更改为碎片,因此修改后的方法定义如下:

Intent intent = new Intent(fragment.getContext(), CameraCaptureActivity.class);fragment.startActivityForResult(intent,requestCode);

之后,我能够在碎片上的onActivityResult中获得价值

其他答案中尚未描述的另一个用例:

使用exception.startResolutionForResult()时,不会调用在片段中声明的onActivityResult()

if (exception is ResolvableApiException) {exception.startResolutionForResult(activity!!, MY_REQUEST_CODE)}

在这种情况下,将exception.startResolutionForResult()替换为片段的startIntentSenderForResult()

if (exception is ResolvableApiException) {startIntentSenderForResult(exception.resolution.intentSender, MY_REQUEST_CODE, null, 0, 0, 0, null)}

静态编程语言版本(在您的活动onActivityResult()中)

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {//add following lines in your activityif(supportFragmentManager?.fragments!=null && supportFragmentManager?.fragments!!.size>0)for (i in 0..supportFragmentManager?.fragments!!.size-1) {val fragment= supportFragmentManager?.fragments!!.get(i)fragment.onActivityResult(requestCode, resultCode, data)}}

首先,您需要在活动中覆盖此代码;

 @Overridepublic void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);}

之后,在你的片段中,

startActivityForResult(intent,GALLERY_REQUEST_CODE);

再一次在你的碎片,

@Overridepublic void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);// Result code is RESULT_OK only if the user selects an Imageif (resultCode == Activity.RESULT_OK) {
}
}

对于那些使用安卓导航组件的人应该在活动的onActivityResult(...)中使用primaryNavigationFragment来获取它的片段引用并调用片段的fragment.onActivityResult(...)

这里是活动onActivityResult(...)

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent imageData){super.onActivityResult(requestCode, resultCode, imageData);
for (Fragment fragment : getSupportFragmentManager().getPrimaryNavigationFragment().getChildFragmentManager().getFragments()){fragment.onActivityResult(requestCode, resultCode, imageData);}}

有了Android的导航组件,这个问题,当你有嵌套碎片,可能感觉像是一个无法解决的谜。

基于这篇文章中以下答案的知识和灵感,我设法制定了一个简单的解决方案:

在活动的onActivityResult()中,您可以遍历使用FragmentManagergetFragments()方法获得的活动Fragments列表。

请注意要做到这一点,您需要使用getSupportFragmentManager()或目标API 26及更高版本。

这里的想法是循环遍历列表,检查列表中每个片段的实例类型,使用instanceof

虽然循环遍历此类型Fragment的列表是理想的,但不幸的是,当您使用Android导航组件时,列表将只有一个项目,即NavHostFragment

那么现在呢?我们需要得到NavHostFragment已知的片段。NavHostFragment本身就是一个片段。所以使用getChildFragmentManager().getFragments(),我们再次得到NavHostFragment已知的List<Fragment>个片段。我们循环检查该列表中的instanceof每个片段。

一旦我们在列表中找到我们感兴趣的片段,我们调用它的onActivityResult(),将活动onActivityResult()声明的所有参数传递给它。

//  Your activity's onActivityResult()
@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);
List<Fragment> lsActiveFragments = getSupportFragmentManager().getFragments();for (Fragment fragmentActive : lsActiveFragments) {
if (fragmentActive instanceof NavHostFragment) {
List<Fragment> lsActiveSubFragments = fragmentActive.getChildFragmentManager().getFragments();for (Fragment fragmentActiveSub : lsActiveSubFragments) {
if (fragmentActiveSub instanceof FragWeAreInterestedIn) {fragmentActiveSub.onActivityResult(requestCode, resultCode, data);}
}
}
}
}

静态编程语言版本适用于那些使用Android导航组件的人,灵感来自Moshot Mehta的回答

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)supportFragmentManager.primaryNavigationFragment?.childFragmentManager?.fragments?.forEach { fragment ->fragment.onActivityResult(requestCode, resultCode, data)}}

在我的情况下,在开发者选项中,我打开了“不要保持活动”,这导致了这个问题。

以防它帮助某人。

onActivityResult现在已弃用。您可以使用以下代码:

   registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result->// here you can handle result, result.data and result.resultCode}

开始活动

    val intent = Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE)launcher.launch(intent)

如果您正在使用Navigation Component,请从@Moshot Mehta获得帮助,这也可能对您有所帮助。它对我有用…

MainActivityonActivityResult方法中粘贴下面的代码:

for (Fragment fragment : navHostFragment.getChildFragmentManager().getFragments()){if (fragment != null){Log.d(TAG, "onResult Has Been Sent!");fragment.onActivityResult(requestCode, resultCode, data);}}

YOUR FRAGMENTonActivityResult方法中,您可以得到结果。希望对你有帮助