【问题标题】:onActivityResult is not being called in Fragment片段中未调用 onActivityResult
【发布时间】: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);
    }
}

【问题讨论】:

标签: android android-fragments android-activity


【解决方案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 时,感觉就像一个无法解开的谜。

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

        在您的活动的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) - 所以它只是一个方便的包装器
                                        猜你喜欢
                                        • 2019-12-05
                                        • 2014-08-11
                                        相关资源
                                        最近更新 更多