片段的onActivityResult

Nat*_*th5 34 java android android-intent android-contacts android-fragments

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

更新:

如果我改变:

startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
Run Code Online (Sandbox Code Playgroud)

getActivity().startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
Run Code Online (Sandbox Code Playgroud)

然后它工作,但其他帖子让我认为这是不正确的.

Zep*_*hyr 52

我认为你仍然应该startActivityForResult()直接在片段中使用调用,没有用getActivity().startActivityForResult().

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

你不能调用startActivityForResult()活动,否则不会调用onActivityResult()片段中的片段.


小智 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);
    }
}
Run Code Online (Sandbox Code Playgroud)


4gu*_*71n 1

片段的还onActivityCreated具有另一个目的:

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

这是从文档中提取的

主要使用片段,您将在 中膨胀并返回视图,在 中onCreateView执行视图操作(例如ListAdapter在 a 中设置 an ) 。并在.ListViewonViewCreatedonActivityCreated

您有多种选择,我不太确定哪个更适合您的问题:

  • 我要做的将是findFragmentByIdonActivityResult活动的 中执行 a 操作,如果片段不是null,则执行一个处理从片段中的联系人列表返回的方法。

  • 另一种方法是BroadCastReceiveronActivityResult活动中触发一个,并注册您的片段以收听该广播。但我认为对于如此简单的事情来说这太混乱了。

  • 最后,与第一个一样,如果您没有带有 id 的片段,则可以在活动中实例化该片段,保存引用,并在onActivityResult执行活动时向其发送消息。

我希望本文对您有所帮助。