片段中未调用onActivityResult


876

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

2
检查这个帖子,有问题的描述和解决方法常见的解决方案:stackoverflow.com/questions/6147884/...
奥莱克西K.

5
读过此书的其他任何人都可以确保您通过requestCode >= 0
穆罕默德·巴巴尔

3
还要确保您的Activity LauchMode不得为singleInstance或singleTask。否则onActivityResult将不会被调用
Jawad Zeb

看到此链接可能会对您有所帮助:androidtutorialonline.com/onactivityresult-in-fragment
Android教程

我们需要将Activity中的onActivityResult重定向到Fragment。请参考以下链接:codexpedia.com/android/...
Reejesh PK

Answers:


1239

托管活动将覆盖onActivityResult(),但未调用super.onActivityResult()未处理的结果代码。显然,即使片段是进行startActivityForResult()调用的片段,该活动也可以处理结果。当您考虑片段的模块化时,这很有意义。一旦实现super.onActivityResult()了所有未处理的结果,该片段就可以处理结果了。

并且也来自@siqing答案:

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


34
在您的活动的onActivityResult,呼叫super.onActivityResult()
Spidy

167
@StErMi确保从片段中调用startActivityForResult()而不是getActivity()。startActivityForResult()。请参见下面的siqing答案。
OferR 2012年

8
似乎存在一个相关的错误,其中正在使用支持库code.google.com/p/android/issues/detail?id=15394
Ollie C

82
还要注意,如果您使用嵌套片段,则应调用子片段,getParentFragment().startActivityForResult以便父片段将调用其onActivityResult方法。
Eric Brynsvold 2013年

7
@EricBrynsvold是正确的,startActivityForResult在嵌套片段中不起作用。为此,最好调用getParentFragment()。startActivityForResult(),然后在该父片段中实现onActivityResult(),然后在该方法中将结果传递给子fragmen,即:childFragment.getParentFragment()。 onActivityResult(requestCode,resultCode,data)
edrian 15'

328

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


3
我也有同样的问题与RingtonePreference位于PreferenceFragment。不幸的是,RingtonePreference电话getActivity().startActivityForResult(),和我没有得到结果,即便是我叫super.onActivityResult的活动的onActivityResult。我不得不创建一个派生自RingtonePreference类的类,该类将自身绑定到PreferenceFragment和调用fragment.startActivityForResult()
Stan

@siqing我无法从我的静态方法调用startActivitForResult。有什么解决办法吗?我必须使用activity.startActivityForResult。请帮助我
Shreyash Mahajan

269

选项1:

如果startActivityForResult()从片段中调用startActivityForResult(),则应调用,而不是getActivity().startActivityForResult(),因为它将导致片段onActivityResult()。

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

选项2:

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

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

选项3:

从片段到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
}

4
这对我有用。这是一个令人讨厌的解决方法,但是我没有更好的主意来解决这个愚蠢的错误……
Bogdan Zurac

@Vivky,您的回答对我有用。但是,我还面临着另一个问题,而不是setResult(); finish();当我从第二个活动中按回去时,也会onActivityResult被调用provider RESULT_CODE
snehal_penurkar 2015年

极好的答案。我实现了第三个解决方案。
Sash_KP 2015年

我认为解决方案3对我onActivityResult()有用requestCode,但是活动的返回一个奇怪的消息,该消息传递给我的片段,然后被忽略= /
E-Kami

1
@notGeek你是正确的。即使您是从片段或活动中调用的,结果也总是在活动中获取。
Vinayak

83

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

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

3
该死的,我以为我只是找到了最简单的解决方案,但是没有诸如getFragments()这样的方法。
WindRider 2014年

2
@WindRider有。如果您使用Android支持库(AppCompat)。
dasar 2014年

2
另外,我了解了一种很难的方法,您必须检查数组中的片段是否不是对自身的引用!`if(fragment!= this){fragment.onActivityResult(requestCode,resultCode,data); `
reubenjohn 2015年

如果片段是嵌套的,这将不起作用,因为只有顶部的片段会在列表中。我相信super.onActivityResult()已经在列表中的所有片段上调用了onActivityResult(),所以这个想法是多余的。
BeccaP 2015年


83

我在时遇到了同样的问题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
如果您的孩子Fragment是私有成员,请使用Fragment fragment = myChildFragment;替换上面findFragmentByTag的代码行。其余的可以保持不变。
lcn

7
我想我强烈建议不要将片段保留为私人成员。他们有自己的生命周期,因此您永远不知道经理是否处于与他们互动的良好状态。而且它们非常笨重,我会担心内存泄漏。如果您不需要使用管理器,则不会创建它。
MinceMan

67

原始帖子。

FragmentActivityrequestCode由修改后的替换。之后,onActivityResult()将被调用时,FragmentActivity解析高16位并恢复原始Fragment的索引。看一下这个方案:

在此处输入图片说明

如果您在根级别上有一些片段,那就没有问题。但是,如果您有嵌套的片段(例如,Fragment其中带有一些选项卡)ViewPager,则可以保证会遇到问题(或已经遇到问题)。

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

在此处输入图片说明

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

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


我有一个与在父片段中使用ViewPager(将其他片段作为选项卡保存)相同的问题。使用嵌套的片段问题进行了尝试,但最终出现了编译错误。你能给我建议解决方案吗?这里也提出了一个问题github.com/shamanland/nested-fragment-issue/issues/2
cgr

我回答在GitHub上,所以让我们继续这个对话离开这里github.com/shamanland/nested-fragment-issue/issues/...
奥列克西·K.

谢谢!如果不是推荐的解决方案,我建议相应地编辑答案,这样就不必花时间尝试知道它有编译错误。
cgr

44

这是最受欢迎的问题之一。我们可以找到许多有关此问题的线索。但是它们都不对我有用。

因此,我已经使用此解决方案解决了这个问题。

首先让我们了解为什么会这样。

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

startActivityForResult从Fragment 调用后,requestCode将更改为将Fragment的身份附加到代码中。一旦收到结果,Activity将能够追溯到谁发送了此请求。

一旦将Activity导航回去,结果将发送到带有修改后的requestCode的Activity的onActivityResult上,该代码将解码为原始requestCode + Fragment的身份。之后,活动将通过onActivityResult将活动结果发送到该片段。一切都完成了。

问题是:

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

解:

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

       /** 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) {

       }
}

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


我只是要求使用“活动”来实现系统意图,所以我只需要使用片段上下文。
Uzair

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”的情况。


在“ 活动”>“片段(ViewPager)”>“片段
Oleksandr Firsov

14

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

对于Hosting活动,如果有,将no history属性设置为false。

android:noHistory="false"

对于要启动的“活动”,如果有

android:launchMode="standard"

13

一旦将此代码块从Fragment移到Utility类parentActivity作为参数传递,我也面临着同样的问题,

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

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

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

之后,我就可以onActivityResultFragment上获得价值


10

我也在片段中遇到了这个问题。然后我打来startActivityForResult了电话DialogFragment

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


太好了,为我工作,因为我是startActivityForResult(...)从片段代码中的抽象类调用的。
文斯

9

对于嵌套片段(例如,使用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
}

8

在我的情况下,这是一个Android错误(http://technet.weblineindia.com/mobile/onactivityresult-not-getting-call-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);
        }
    }
}

6

简而言之,

片段中声明Fragment fragment = this

之后使用fragment.startActivityForResult

结果将返回到activityResult中。


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


5

在片段内,致电

this.startActivityForResult(intent, REQUEST_CODE);

哪里this是指片段。否则,按照@Clevester所说的那样做:

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

我也不得不打电话

super.onActivityResult(requestCode, resultCode, data);

在父级活动onActivityResult中发挥作用。

(我改编自@Clevester的答案。)


5

对于那些使用Android导航组件的用户,应在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);
    }
}

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.myFragmentFragment您正在使用。或者,使用FragmentManager获取Fragment而不是在中保留对其的引用HostActivity。另外,null在尝试致电之前,请检查一下this.myFragment.onActivityResult(...);


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

3
  1. 您可以简单地onActivityResult在fragment上覆盖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. 在片段工具上 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();
      }
    }

此解决方法可以解决问题。


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

2

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

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

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


1

我非常怀疑这里所有的答案都不过是黑客。我已经尝试了所有其他方法,但都没有可靠的结论,因为始终存在某种愚蠢的问题。我不能依靠不一致的结果。如果您查看Fragments的官方Android API文档,您会看到Google明确声明以下内容:

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

另请:Android Fragment API

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


2
我不认为“从Activity调用startActivityForResult”是建议。如果你看一下片段的碱基类中实现,那么它是所有mActivity.startActivityFromFragment(this, intent, requestCode)-所以它不是别的,而是一种便利的包装
反Veeranna

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

这实际上有效,我只得到一票。动态创建片段。太简单了,但是它是真正的工作解决方案。甚至有人试图为我编辑它。
danny117 '16

1

我的问题是关于主机活动,我发现它带有一组, android:launchMode="standard"我暂时将其删除了,并且可以正常工作!


1

没有mention一点可以确保您的“主机活动” 启动模式不能设置为singleInstancesingleTask

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

standardsingleTop启动模式将正常工作。


1

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

getParentFragment().startActivityForResult(intent, RequestCode);

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


1

我已经通过编写扩展基类来处理这个问题Fragment,并在onactivityresult我已经确定使用当前运行的片段的活性fragmenttag。然后,我在fragmentbase类中调用用户定义的方法。这将在当前正在运行的片段中触发一个事件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.