片段中未调用 onActivityResult

Posted

技术标签:

【中文标题】片段中未调用 onActivityResult【英文标题】:onActivityResult is not being called in Fragment 【发布时间】:2011-09-03 02:56:56 【问题描述】:

当相机 Activity 返回时,承载此片段的 Activity 会调用其 onActivityResult

我的片段启动了一个结果活动,目的是发送给相机拍照。图片应用程序加载正常,拍照并返回。但是,onActivityResult 永远不会被击中。我设置了断点,但没有触发任何东西。片段可以有onActivityResult吗?我会这么认为,因为它是一个提供的功能。为什么没有触发?

ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() 
    @Override
    public void onClick(View view) 
        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, 1888);
    
);

@Override
public 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);
    

【问题讨论】:

查看这个帖子,有问题描述和常见的解决方法:***.com/questions/6147884/… 其他阅读本文的人请确保您通过requestCode >= 0 还要确保你的 Activity LauchMode 不能是 singleInstance 或 singleTask。否则 onActivityResult 将不会被调用 看到这个链接可能对你有帮助:androidtutorialonline.com/onactivityresult-in-fragment 我们需要将Activity中的onActivityResult重定向到Fragment。参考这个链接:codexpedia.com/android/… 【参考方案1】:

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)

【讨论】:

【参考方案2】:

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

//Java

// In your activity
@Override
protected 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)
        
    

【讨论】:

该死,我以为我只是找到了最简单的解决方案,但是没有 getFragments() 这样的方法。 @WindRider 有。如果您使用 Android 支持库 (AppCompat)。 另外,我学到了一个艰难的方法,你必须检查数组中的片段是否不是对自身的引用! ` if(fragment!=this) fragment.onActivityResult(requestCode, resultCode, data); ` 如果片段是嵌套的,这不起作用,因为只有顶部片段会在列表中。我相信 super.onActivityResult() 已经在列表中的所有片段上调用 ​​onActivityResult() 了,所以这个想法是多余的。 这就像魅力男,你拯救了我的一天。非常感谢你的朋友。【参考方案3】:

添加这个

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 method
    Intent intent=new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT)
    startActivityForResult(intent,1);
    Toast.makeText(getContext(), "image"+intent, Toast.LENGTH_SHORT).show();

【讨论】:

【参考方案4】:

就我而言,在开发者选项中我打开了“不保留活动”,这导致了这个问题。

万一它对某人有帮助。

【讨论】:

【参考方案5】:

Kotlin 版本适用于那些使用受 Mohit Mehta 回答启发的 Android 导航组件的人

 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)
    

【讨论】:

这是正确的代码覆盖 fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) super.onActivityResult(requestCode, resultCode, data) activity?.supportFragmentManager?.primaryNavigationFragment?. childFragmentManager?.fragments?.forEach fragment -> fragment.onActivityResult(requestCode, resultCode, data) 为 Kotlin 导航组件工作 我应该在 forEach 范围内还是在 forEach 范围之后的主范围内编写代码(例如 if(resultCode != Result_ok))? 它解决了我的问题,导航图片段 onActivityResult 。做得好【参考方案6】:

使用 Android 的导航组件,这个问题,当您嵌套了 Fragments 时,感觉就像一个无法解开的谜。

根据本文中以下答案的知识和灵感,我设法制定了一个有效的简单解决方案:

Answer in this post Answer in this post

在您的活动的onActivityResult() 中,您可以循环通过使用FragmentManagergetFragments() 方法获得的活动片段列表。

请注意,要执行此操作,您需要使用getSupportFragmentManager() 或针对 API 26 及更高版本。

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

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

那么现在呢?我们需要让NavHostFragment 知道片段。 NavHostFragment 本身就是一个片段。因此,使用getChildFragmentManager().getFragments(),我们再次获得NavHostFragment 已知的片段的List<Fragment>。我们遍历该列表,检查每个 Fragment 的 instanceof

一旦我们在列表中找到感兴趣的 Fragment,我们将其称为 onActivityResult(),并将 Activity 的 onActivityResult() 声明的所有参数传递给它。

//  Your activity's onActivityResult()

@Override
protected 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);
                    

                

            

        

    

【讨论】:

【参考方案7】:

对于那些使用Android Navigation Component的人应该在Activity的onActivityResult(...)中使用primaryNavigationFragment来获取它的片段引用并调用片段的fragment.onActivityResult(...)

这是活动的onActivityResult(...)

@Override
public 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);
    

【讨论】:

【参考方案8】:

首先你需要在Activity中重写这段代码;

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

之后,在您的片段中,

startActivityForResult(intent,GALLERY_REQUEST_CODE);

再一次比在你的片段中,

@Override
public 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 Image
    if (resultCode == Activity.RESULT_OK) 

    


【讨论】:

【参考方案9】:

Kotlin 版本(在您的活动 onActivityResult())

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
    //add following lines in your activity
    if(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)
    
 

【讨论】:

【参考方案10】:

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

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

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)

【讨论】:

【参考方案11】:

当我将这段代码从 Fragment 转移到 Utility Class 时,我也遇到了同样的问题,parentActivity 作为参数传递,

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

然后我在那个 FragmentonActivityResult 方法中没有得到任何价值, 之后,我把 argument 改成了 Fragment,所以修改后的方法定义看起来像,

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

在那之后,我能够在 Fragment

上获得 onActivityResult 的价值

【讨论】:

【参考方案12】:

选项 1:

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

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

选项 2:

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

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

选项 3:

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

在父Activity类中,重写onActivityResult()方法,甚至在Fragment类中重写,调用如下代码。

在父类中:

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

在子类中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    // In fragment class callback

【讨论】:

这对我有用。这是一个令人讨厌的解决方法,但我没有更好的主意来解决这个愚蠢的错误...... @Vivky,您的回答对我有用。但是我还面临一个问题,而不是setResult(); finish();,当我从第二个活动中按下时,onActivityResult 也被提供的RESULT_CODE 调用。 绝妙的答案。我实施了第三个解决方案来完成它。 我认为解决方案 3 对我有用,但活动的 onActivityResult() 返回一个奇怪的 requestCode,它被传递给我的片段,然后被忽略 =/ @notGeek 你是对的。即使您从片段或活动中调用,结果也始终在活动中接收。【参考方案13】:

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

还有来自@siqing 的回答:

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

【讨论】:

在你activity的onActivityResult中,调用super.onActivityResult() @StErMi 确保从片段中调用 startActivityForResult() 而不是 getActivity().startActivityForResult()。请参阅下面的四清答案。 似乎有一个相关的错误,正在使用支持库code.google.com/p/android/issues/detail?id=15394 另外请注意,如果您使用嵌套片段,则子片段应调用getParentFragment().startActivityForResult,以便父片段将调用其 onActivityResult 方法。 @EricBrynsvold 是对的,startActivityForResult 在嵌套片段中不起作用。为此,您最好调用getParentFragment().startActivityForResult(),然后在该父片段中实现onActivityResult(),并在该方法中将结果传递给子片段,即:childFragment.getParentFragment()。 onActivityResult(requestCode, resultCode, data)【参考方案14】:

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);
    

【讨论】:

如果你有你的子 Fragment 作为私有成员,那么使用Fragment fragment = myChildFragment; 替换上面的findFragmentByTag 代码行。其余的可以保持不变。 我想我强烈建议不要将片段保留为私有成员。他们有自己的生命周期,所以你永远不知道他们是否处于良好的互动状态,经理知道。它们也很重,我会担心内存泄漏。如果您不需要使用管理器,就不会创建它。【参考方案15】:

就我而言,这是一个 Android 错误 (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);
        
    

【讨论】:

【参考方案16】:

如果您使用嵌套片段,这也可以:

getParentFragment().startActivityForResult(intent, RequestCode);

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

【讨论】:

【参考方案17】:

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

@Override
public 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 实现,上面的代码示例就是答案。

【讨论】:

【参考方案18】:

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

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

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

我们可以直接从 Fragment 调用startActivityForResult 但实际上背后的机制都是由 Activity 处理的。

一旦您从 Fragment 调用 startActivityForResult,requestCode 将被更改以将 Fragment 的身份附加到代码中。这将使 Activity 能够在收到结果后追踪发送此请求的人。

一旦 Activity 被导航回来,结果将被发送到 Activity 的 onActivityResult 以及修改后的 requestCode 将被解码为原始 requestCode + Fragment 的标识。之后,Activity 会通过 onActivityResult 将 Activity Result 发送到该 Fragment。一切都完成了。

问题是:

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

解决方案:

1) 通过以下代码在 Fragment 中启动 Intent:

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

2) 现在在您的 Parent Activity 中覆盖 **onActivityResult() :**

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);
    

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

3) 在您的片段调用中:

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

       

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

【讨论】:

我用“活动”请求系统意图,我只需要使用片段上下文。 这应该是公认的解决方案,它解释了发生的事情,而不仅仅是婴儿喂食代码【参考方案19】:

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

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

standardsingleTop 启动模式可以正常工作。

【讨论】:

【参考方案20】:

我的问题出在 Host 活动上,我用一组 android:launchMode="standard" 找到了它,我暂时删除了它并且它可以工作!

【讨论】:

【参考方案21】:

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

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

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

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() 
        @Override
        public 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);
        

        @Override
        public 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();

【讨论】:

这确实有效,我只投了一票。即时创建片段。太容易了,但它真正的工作解决方案。甚至有人试图为我编辑它。【参考方案22】:

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

在您的主要活动中

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);

在您的片段中:

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

在您的嵌套片段中

通话活动

getParentFragment().startActivityForResult(intent, uniqueInstanceInt);

uniqueInstanceInt - 用嵌套片段中唯一的 int 替换它,以防止另一个片段处理答案。

接收响应

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    if (requestCode == uniqueInstanceInt ) 
        // TODO your code
    

注意

需要在 uniqueInstanceInt 中使用 0 到 65536 之间的数字以避免错误“只能将低 16 位用于 requestCode”。

【讨论】:

Activity > Fragment (ViewPager) > Fragment 中效果很好【参考方案23】:

只需调用:

startActivityForResult(intent, "1");

【讨论】:

你能详细解释一下吗?【参考方案24】:

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

在你的主要活动中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);

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

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    YourFragment frag = (YourFragment) getChildFragmentManager().getFragments().get(viewPager.getCurrentItem());
    frag.yourMethod(data);  // Method for callback in YourFragment
    super.onActivityResult(requestCode, resultCode, data);

在 YourFragment(嵌套片段)中:

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

【讨论】:

【参考方案25】:

如果在 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);

【讨论】:

【参考方案26】:

只需将以下代码用于片段。

@Override
public 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 将调用而不调用其父级。

【讨论】:

【参考方案27】:

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

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

【讨论】:

太好了,对我有用,因为我从片段代码中的抽象类调用 startActivityForResult(...)【参考方案28】:

在你的片段中,调用

this.startActivityForResult(intent, REQUEST_CODE);

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

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

我也不得不打电话

super.onActivityResult(requestCode, resultCode, data);

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

(我根据@Clevester 的回答改编了这个答案。)

【讨论】:

【参考方案29】:

解决方案 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

【讨论】:

【参考方案30】:

我强烈怀疑这里的所有答案都只不过是黑客行为。我已经尝试了所有这些以及许多其他方法,但没有任何可靠的结论,因为总是存在某种愚蠢的问题。我不能依赖不一致的结果。如果您查看 Fragments 的官方 Android API 文档,您会看到 Google 清楚地声明了以下内容:

从片段所在的 Activity 调用 startActivityForResult(Intent, int)。

见:Android Fragment API

因此,似乎最正确和最可靠的方法是从托管活动中实际调用 startActivityForResult() 并处理生成的 onActivityResult()在那里。

【讨论】:

我不认为“从 Activity 调用 startActivityForResult”是一个建议。如果您查看 Fragment 基类中的实现,那么它所做的就是mActivity.startActivityFromFragment(this, intent, requestCode) - 所以它只是一个方便的包装器

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

片段中未调用 onAttach()

片段android中未调用onActivityResult [重复]

Android:片段在活动结果合同中未收到 RESULT_OK

FragmentContainerView 中未调用/显示 OnMapReady

AppSync 示例应用程序中未生成片段

getSupportFragmentManager() 在活动扩展片段中未定义