Подтвердить что ты не робот

OnActivityResult For Fragment

В настоящее время у меня есть базовая активность, в которой размещен один фрагмент. Внутри фрагмента у меня есть метод, который запускает переключатель выбора.

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
}

как для моей базовой операции, так и для фрагмента, но ни один из методов не запускается. Если возможно, я хотел бы, чтобы обработчик фрагмента возвращал, чтобы не мутировать активность.

Пожалуйста, дайте мне знать, что лучше всего в этой ситуации.

Update:

если я изменил:

startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);

к

getActivity().startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);

тогда он работает, но другие сообщения заставляют меня думать, что это неверно.

4b9b3361

Ответ 1

Я думаю, что вы все равно должны использовать вызов startActivityForResult() непосредственно в фрагменте, не используйте getActivity().startActivityForResult().

Я вызываю startActivityForResult() во Фрагменте и реализую onActivityResult во Фрагменте, onActivityResult() вызывается правильно.

вы не можете вызвать startActivityForResult() в действии, иначе 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);
    }
}

Ответ 3

onActivityCreated фрагмента служит другой цели:

Вызывается, когда была создана операция фрагмента и создана эта иерархия представления фрагментов. Он может использоваться для выполнения окончательной инициализации после того, как эти части находятся на месте, например, для получения представлений или восстановления состояния. Это также полезно для фрагментов, которые используют setRetainInstance (boolean) для сохранения своего экземпляра, поскольку этот обратный вызов сообщает фрагменту, когда он полностью связан с новым экземпляром активности. Это вызывается после onCreateView (LayoutInflater, ViewGroup, Bundle) и перед onViewStateRestored (Bundle).

Это извлечено из документации

В основном с фрагментом вы будете раздувать и возвращать представление в onCreateView, выполнять операции просмотра (например, установить ListAdapter в ListView) в onViewCreated. И выполните операции инициализации (например, показать диалог приветствия или что-то подобное) в onActivityCreated.

У вас есть несколько вариантов, я не уверен, что лучше для вашей проблемы:

  • Что бы я сделал, сделаем findFragmentById в onActivityResult для действия, а если фрагмент не является null, выполните метод, который обрабатывает возврат из списка контактов в фрагменте.

  • Еще один способ сделать это: a BroadCastReceiver в onActivityResult активности и зарегистрировать фрагмент, чтобы прослушать эту трансляцию. Но я думаю, что это слишком грязно для чего-то такого простого.

  • Наконец, как и первый, если у вас нет фрагмента с идентификатором, вы можете создать экземпляр фрагмента в своей деятельности, сохранить ссылку и отправить сообщение, когда onActivityResult активность выполняется.

Я надеюсь, что что-то из этого вам поможет.

Ответ 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());
             }
         }
}