OnActivityResult Para Fragmento

Actualmente tengo una actividad base que alberga un solo fragmento. Dentro del fragmento tengo un método que inicia el selector de contacto.

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

Cuando esta actividad devuelve cómo debo capturar los resultados. He intentado agregar un

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

Tanto a mi actividad base como al fragmento, pero ninguno de los dos métodos se activa. Si es posible, quisiera que el fragmento manejara la devolución para no enturbiar la actividad.

Por favor, hágamelo saber cuál es la mejor práctica en esta situación.

Actualizar:

Si cambio:

 startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST); 

a

 getActivity().startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST); 

Entonces funciona, pero otros mensajes me han hecho pensar que es incorrecto.

Creo que todavía debe utilizar la llamada startActivityForResult() directamente en el fragmento, no use getActivity().startActivityForResult() .

Llamo a startActivityForResult() en Fragmento e implemento el onActivityResult en Fragment, el onActivityResult() se llama correctamente.

No se puede llamar a startActivityForResult() en actividad, de lo contrario no se llamará onActivityResult() en Fragment.

En mi caso lo hice en mi Actividad de Padres

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

El onActivityCreated del fragmento sirve a otro propósito:

Se llama cuando se ha creado la actividad del fragmento y se ha instanciado la jerarquía de este fragmento. Se puede utilizar para hacer la inicialización final una vez que estas piezas están en su lugar, como recuperar vistas o restaurar el estado. También es útil para fragmentos que utilizan setRetainInstance (boolean) para conservar su instancia, ya que esta devolución de llamada le dice al fragmento cuando está totalmente asociado con la nueva instancia de actividad. Esto se llama después onCreateView (LayoutInflater, ViewGroup, Bundle) y antes de onViewStateRestored (Bundle).

Esto se extrae de la documentación

Principalmente con un fragmento se inflar y devolver la vista en el onCreateView , hacer las operaciones de vista (como establecer un ListAdapter en un ListView ) en el onViewCreated . Y realizar las operaciones de inicialización (como mostrar un diálogo de bienvenida o algo así) en el onActivityCreated .

Usted tiene, varias opciones, no estoy bastante seguro de que es mejor para su problema:

  • Lo que haría será hacer un findFragmentById en el onActivityResult de la actividad, y si el fragmento no es null , ejecuta un método que maneja el volver de la lista de contactos en el fragmento.

  • Otra forma de hacerlo es disparar un BroadCastReceiver en el onActivityResult de la actividad, y registrarlo fragmentará para escuchar esa transmisión. Pero creo que esto es demasiado complicado para algo tan simple.

  • Finalmente, al igual que el primero, si no tiene un fragmento con un id, puede instanciar el fragmento en su actividad, guardar una referencia y enviarle un mensaje cuando se onActivityResult el onActivityResult de la actividad.

Espero que algo de esto le ayude.

Esto le ayudará onActivityResult en Fragments

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

Y

 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()); } } } 
  • Versión incorrecta de keystore en la llamada android
  • ¿Cómo obtengo una variable en otra actividad?
  • Diseño personalizado para DialogFragment OnCreateView vs. OnCreateDialog
  • Android WebView: sólo carga HTML, no carga JS o CSS (en algunos dispositivos)
  • Los datos permanecen en el almacén de datos local después de desenfilar
  • Borrar edittext enfocar y ocultar el teclado cuando se pulsa el botón
  • Fondos de Android Live con OpenGL ES 2.0?
  • Método get () de AsyncTask: ¿Existe algún escenario en el que realmente sea la mejor opción?
  • Cómo acceder a variables de actividad de un fragmento Android
  • Cómo crear un archivo apk en la línea de comandos?
  • El seguimiento de referencias de Android no funciona con Google play
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.