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()); } } } 
  • ¿Cómo puedo comprobar si mi tabla sqlite contiene datos?
  • Devuelve el recuento de registros en una variable, Sqlite, Android, Java
  • ¿Es una práctica aceptable en Java anidar las sentencias try / catch?
  • Desarrollo de Android en eclipse: la actividad 1 cambia a la actividad 2 bien, no 3
  • Icu4j es demasiado grande, cualquier alternativa?
  • J2objc - tipos de objetos de resolución
  • NetBeans Clean & Build Error de Android: Java.Lang X500 Acceso principal
  • Cómo agregar o eliminar el filtro intención mediante programación en android?
  • Las cadenas contienen los mismos caracteres pero siguen siendo diferentes
  • Android construir dibujo bug cashe
  • Android: Descargar el archivo desde el sitio web protegido por contraseña
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.