961

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

40 回答 40

1330

托管活动覆盖onActivityResult(),但它没有调用super.onActivityResult()未处理的结果代码。显然,即使 Fragment 是发出startActivityForResult()调用的那个,Activity 还是第一次处理结果。当您考虑片段的模块化时,这是有道理的。一旦我实现super.onActivityResult()了所有未处理的结果,片段就可以处理结果。

还有来自@siqing 的回答:

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

于 2011-05-27T04:42:16.570 回答
356

我想你打电话了getActivity().startActivityForResult(intent,111);。你应该打电话startActivityForResult(intent,111);

于 2012-06-13T09:13:48.960 回答
306

选项1:

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

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

选项 2:

由于 Activity 得到 的结果onActivityResult(),您将需要覆盖 ActivityonActivityResult()并调用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
}
于 2013-06-12T09:17:30.237 回答
106

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

//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)
        }
    }
于 2014-03-27T10:40:11.357 回答
86

我遇到了同样的问题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);
    }
}
于 2013-05-08T20:44:13.080 回答
72

原帖。

FragmentActivity替换requestCode为修改后的。之后,when onActivityResult()will 被调用,FragmentActivity解析高16位,恢复原Fragment的索引。看看这个方案:

在此处输入图像描述

如果您在根级别有一些片段,则没有问题。但是如果你有嵌套的片段,例如Fragment里面有几个标签ViewPager,你保证会遇到一个问题(或者已经遇到过)。

因为里面只存储了一个索引requestCode。那是Fragment其内部的索引FragmentManager。当我们使用嵌套的 Fragment 时,有 child FragmentManager,它们有自己的 Fragment 列表。因此,有必要保存从 root 开始的整个索引链FragmentManager

在此处输入图像描述

我们如何解决这个问题?这篇文章中有一个常见的解决方法。

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

于 2014-06-19T09:34:27.993 回答
47

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

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

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

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

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

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

问题是:

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

解决方案:

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

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

2)现在在您的父活动覆盖**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) {

       }
}

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

于 2016-09-01T09:12:57.470 回答
19

对于那些使用Android 导航组件的人,应该在 ActivityonActivityResult(...)中使用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);
    }
}
于 2019-11-22T04:44:17.687 回答
18

对于许多嵌套片段(例如,在片段中使用 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”。

于 2016-01-22T17:17:33.673 回答
15

一旦我将这段代码从Fragment转移到Utility Class并作为参数parentActivity传递,我也面临同样的问题,

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

然后我在那个FragmentonActivityResult的方法中没有得到任何值,之后,我将参数更改为Fragment,所以修改后的方法定义看起来像,

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

在那之后,我能够在onActivityResultFragment 上获得价值

于 2018-02-07T07:05:48.550 回答
14

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

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

android:noHistory="false"

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

android:launchMode="standard"
于 2012-12-30T03:36:06.810 回答
13

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)
    }
}
于 2020-04-07T05:20:57.207 回答
11

FOR NESTED FRAGMENTS(例如,当使用 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
}
于 2015-11-17T12:18:16.397 回答
10

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

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

于 2014-12-24T09:55:46.090 回答
8

就我而言,这是一个 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);
        }
    }
}
于 2015-12-14T14:02:46.357 回答
7

简而言之,

在片段中,声明Fragment fragment = this

之后使用fragment.startActivityForResult

结果将在activityResult中返回。

于 2014-07-18T07:24:04.563 回答
6

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

于 2014-12-18T09:01:14.340 回答
5

在您的片段中,调用

this.startActivityForResult(intent, REQUEST_CODE);

wherethis指的是片段。否则按照@Clevester 所说的那样做:

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

我也不得不打电话

super.onActivityResult(requestCode, resultCode, data);

在父活动onActivityResult中使其工作。

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

于 2014-12-23T08:11:16.663 回答
5

使用Android 的 Navigation 组件当您嵌套了 Fragments 时,这个问题可能会感觉像是一个无法解开的谜团。

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

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

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

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

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

那么现在怎么办?我们需要让NavHostFragment. NavHostFragment本身就是一个片段。如此使用getChildFragmentManager().getFragments(),我们又一次得到了List<Fragment>我们所熟知的 Fragments NavHostFragment。我们遍历该列表检查instanceof每个片段。

一旦我们在列表中找到我们感兴趣的 Fragment,我们调用它,将 Activity声明onActivityResult()的所有参数传递给它。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);
                    }

                }

            }

        }

    }

于 2020-03-13T12:49:51.020 回答
4

这些答案中的大多数一直说您必须super.onActivityResult(...)Activity您的Fragment. 但这似乎对我不起作用。

因此,在您的主机中,Activity您应该改为调用您的主机Fragments onActivityResult(...)。这是一个例子。

public class HostActivity extends Activity {

    private MyFragment myFragment;

    protected void onActivityResult(...) {
        super.onActivityResult(...);
        this.myFragment.onActivityResult(...);
    }
}

在您的某个时刻,您将HostActivity需要分配您正在使用的。或者,使用来获取 ,而不是在您的. 此外,在您尝试调用.this.myFragmentFragmentFragmentManagerFragmentHostActivitynullthis.myFragment.onActivityResult(...);

于 2014-06-08T15:04:40.020 回答
3
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;

    @Override
    public 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() {
            @Override
            public void onClick(View v) {
                // Switch the tab content to display the list view.
                dialog.show();
            }
        });

    return view;
    }

    @Override
    public 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);
    }
} 
于 2013-04-08T08:31:08.500 回答
3
  1. 您可以简单地覆盖 FragmentonActivityResult上的BaseActivity baseActivity.startActivityForResult

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

    private OnBaseActivityResult baseActivityResult;
    public static final int BASE_RESULT_RCODE = 111;
    public interface OnBaseActivityResult{
        void onBaseActivityResult(int requestCode, int resultCode, Intent data);
       }
    }
    
    @Override
    protected 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. 关于 Fragment 工具OnBaseActivityResult

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

这种解决方法可以解决问题。

于 2015-03-31T12:54:01.793 回答
3

如果在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);
于 2015-10-27T13:25:34.647 回答
3

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

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)
}
于 2019-08-18T09:17:32.370 回答
2

添加这个

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();
于 2012-02-20T11:05:04.110 回答
2

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)
    }
 }
于 2019-08-27T11:04:54.763 回答
1

正如 Ollie C 所提到的,当您使用嵌套片段时,使用返回值到 onActivityResult 的支持库存在一个活动错误。我刚刚击中它:-(。

请参阅在 requestCode != 0 时未调用 Fragment.onActivityResult

于 2014-06-09T21:59:07.260 回答
1

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

从包含片段的 Activity 调用 startActivityForResult(Intent, int)。

请参阅:Android 片段 API

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

于 2014-09-15T12:47:31.603 回答
1

您的代码有一个嵌套片段。调用 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();
}
于 2014-11-23T09:25:51.807 回答
1

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

getParentFragment().startActivityForResult(intent, RequestCode);

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

于 2015-11-16T16:54:57.253 回答
1

我的问题是主机活动,我发现它是一组 android:launchMode="standard"我暂时删除它并且它工作!

于 2016-06-23T02:13:00.683 回答
1

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

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

standardsingleTop启动模式将正常工作。

于 2016-08-04T06:36:57.160 回答
1

首先,您需要在 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) {

    }

}
于 2019-11-12T13:36:10.907 回答
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)
于 2021-06-15T05:08:53.963 回答
0

我只是做了一个解决方法:

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

在您的片段中,在 startActivityResult 之前,设置

MainActivity._tempFragment = this;

在 onActivityResult <-- 在 Fragment 之后

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

     // Do your job
     {

     }
     MainActivity._tempFragment = null;
}
于 2013-11-06T09:40:34.967 回答
0

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

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

于 2014-12-26T09:30:32.420 回答
0

如果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、替换thisHomeFragment类并使变量为静态来测试它。我得到了预期的结果。

所以如果你想让片段类有自己的实现onActivityResult,上面的代码示例就是答案。

于 2016-05-04T21:40:32.037 回答
0

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

startActivity(ActivityName);

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

startActivityForResult(intent,"1");

@Override
protected 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.
}
于 2016-05-30T09:21:15.067 回答
0

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

以防它帮助某人。

于 2020-06-22T10:37:26.910 回答
-7

只需简单地调用:

startActivityForResult(intent, "1");
于 2015-11-23T10:47:12.120 回答