【问题标题】:onActivityResult For Fragment片段的 onActivityResult
【发布时间】:2013-12-01 01:51:36
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

我认为你还是应该直接在片段中调用startActivityForResult(),不要使用getActivity().startActivityForResult()

我在 Fragment 中调用startActivityForResult() 并在 Fragment 中实现onActivityResultonActivityResult() 被正确调用。

activity中不能调用startActivityForResult(),否则Fragment中的onActivityResult()将不会被调用。

【讨论】:

    【解决方案2】:

    在我的情况下,我是在父活动中这样做的

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

    【讨论】:

    • getSupportFragmentManager().getFragments() 不是应用程序可用的公共方法。在这里查看文档:developer.android.com/reference/android/support/v4/app/…
    • 绝对不应该赞成这个答案。您可以在片段中直接调用 startActivityForResult 并在片段中实现 onActivityResult 。它会被调用。如果您还必须覆盖父活动中的 onActivityResult,则只需确保调用 super.onActivityResult 以确保您的片段 onActivityResult 也被调用。您当前的解决方案基于不打算由开发人员代码调用的方法,并且基本上是在重做支持库已经为您做的事情。
    【解决方案3】:

    片段的onActivityCreated 另有用途:

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

    这是从documentation中提取的

    主要使用片段,您将在onCreateView 中膨胀并返回视图,在onViewCreated 中执行视图操作(例如在ListView 中设置ListAdapter)。并在onActivityCreated 中执行初始化操作(如显示欢迎对话框或类似的东西)。

    你有几个选择,我不太确定哪个更适合你的问题:

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

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

    • 最后和第一个一样,如果没有带id的fragment,可以在activity中实例化fragment,保存引用,当onActivityResult活动被执行。

    我希望这对你有所帮助。

    【讨论】:

    • 我尝试实现你的第一个解决方案,问题是主活动中的 onActivityResult 没有被调用。有什么想法吗?
    • 我能够通过以下方式使其工作: getActivity().startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);但我读过这不是正确的方法。
    【解决方案4】:

    这将帮助您在片段中onActivityResult

    PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
    startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);
    

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    
            if (requestCode == PLACE_PICKER_REQUEST) {
                if (resultCode == Activity.RESULT_OK) {
                    Place place = PlacePicker.getPlace(data, getActivity());
                 }
             }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 2014-04-28
      • 1970-01-01
      相关资源
      最近更新 更多