tutorial studio fragments example entre ejemplo dinamicos diferencia desde activity abrir java android android-intent android-fragments android-contacts

java - studio - fragments android tutorial



onActivityResult for Fragment (4)

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

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 regrese, ¿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 para mi actividad base como para el fragmento, pero ninguno de los dos métodos se está activando. Si es posible, me gustaría que el fragmento maneje el retorno para no enturbiar la actividad.

Por favor, hágame 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);

luego funciona, pero otras publicaciones me han hecho pensar que es incorrecto.


Creo que todavía deberías usar la llamada startActivityForResult() directamente en fragmento, sin uso getActivity().startActivityForResult() .

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

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


En mi caso, hice esto en mi Actividad para 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); } }


Esto te ayudará en la onActivityResult en fragmentos

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


La onActivityCreated del fragmento tiene otro objetivo:

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

Esto se extrae de la documentation

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

Tienes varias opciones, no estoy muy seguro de cuál es mejor para tu problema:

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

  • Otra forma de hacerlo es disparar un BroadCastReceiver en el onActivityResult de la actividad y registrar el fragmento 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 una identificación, puede crear una instancia del fragmento en su actividad, guardar una referencia y enviar un mensaje cuando se onActivityResult de la actividad.

Espero que algo de esto te ayude.