片段的onActivityResult

时间:2013-11-18 02:05:02

标签: java android android-intent android-fragments android-contacts

我目前有一个托管单个片段的基本活动。在片段内部,我有一个启动联系人选择器的方法。

private void chooseContacts() {
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK,      ContactsContract.Contacts.CONTENT_URI);
    pickContactIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}

当此活动返回时,我应该如何捕获结果。我试过添加一个

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

到我的基本Activity和片段,但都没有触发任何方法。如果可能的话,我希望让片段处理返回,以免混淆活动。

请告诉我这种情况下的最佳做法。

更新

如果我改变:

startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);

getActivity().startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);

然后它有效,但其他帖子让我认为这是不正确的。

4 个答案:

答案 0 :(得分:51)

我认为您仍然应该直接在片段中使用调用startActivityForResult(),不要使用getActivity().startActivityForResult()

我在片段中调用startActivityForResult()并在片段中实现onActivityResult,正确调用onActivityResult()

您无法在活动中调用startActivityForResult(),否则将不会调用Fragment中的onActivityResult()

答案 1 :(得分:6)

就我而言,我在父母活动

中这样做了
    @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);
    }
}

答案 2 :(得分:1)

片段的onActivityCreated有另一个目的:

在创建片段的活动并且实例化此片段的视图层次结构时调用。一旦这些部分就位,它可用于进行最终初始化,例如检索视图或恢复状态。对于使用setRetainInstance(boolean)保留其实例的片段也很有用,因为此回调告诉片段何时与新活动实例完全关联。这是在onCreateView(LayoutInflater,ViewGroup,Bundle)之后和onViewStateRestored(Bundle)之前调用的。

这是从documentation

中提取的

主要是使用片段,您会膨胀并返回onCreateView中的视图,在ListAdapter中执行查看操作(例如在ListView中设置onViewCreated) 。并在onActivityCreated

中执行初始化操作(如显示欢迎对话框或类似内容)

你有几个选择,我不太确定你的问题会更好:

  • 我要做的是在findFragmentById活动中做onActivityResult,如果片段不是null,执行一个处理从片段中的联系人列表返回。

  • 另一种方法是在活动的BroadCastReceiver中触发onActivityResult,然后注册片段以收听该广播。但我认为这对于这么简单的事情来说太过混乱了。

  • 最后,和第一个一样,如果你没有带有id的片段,你可以在你的活动中实例化片段,保存一个引用,并在onActivityResult时向它发送一条消息活动的执行情况。

我希望这对你有所帮助。

答案 3 :(得分:1)

这将有助于您在片段中phpinfo()

Module Authors

onActivityResult