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 elonActivityResult
de la actividad, y si el fragmento no esnull
, 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 elonActivityResult
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.