No se ejecuta el metodo onActivityResult en el Fragmento

646 views
Skip to first unread message

Jorge Vidal

unread,
Feb 5, 2014, 4:30:32 PM2/5/14
to desarrollad...@googlegroups.com
Hola.  Estoy desarrollando sobre la típica aplicación lista - detalle (con dos fragmentos).
El problema es que en el fragmento detalle no se esta ejecutando el método onActivityResult. Estoy usando la aplicación de la cámara para capturar la imagen con startActivityForResult.

En ClienteListaFragment.java :

       //Si no muestro los dos fragmentos llamo a la actividad ClienteFormularioActivity
       if ( ! mostrarDosFragmentos ) {
                
                Intent i = new Intent(getActivity().getApplicationContext(), ClienteFormularioActivity.class);
        i.putExtra("index", position);
        i.putExtra(PrincipalActivity.C_MODO, modo);
        i.putExtra(PrincipalActivity.C_SHOW_TWO_FRAGMENTS, mShowTwoFragments);
    i.putExtra(CuCustomermasterDBData.C_COLUMNA_ID, id);
    startActivity(i );
        }

En ClienteFormularioActivity.java :

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cliente_formulario);

Bundle extras = getIntent().getExtras();

this.modo = extras.getInt(PrincipalActivity.C_MODO);

if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
finish();
return;
}

if (savedInstanceState == null) {
// Adiciono el fragmento
ClienteFormularioFragment detailss = ClienteFormularioFragment.newInstance(
extras.getInt(CuCustomermasterDBData.C_COLUMNA_ID), 
extras.getInt("index"), 
extras.getInt(PrincipalActivity.C_MODO),
extras.getBoolean( PrincipalActivity.C_SHOW_TWO_FRAGMENTS) );
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.frgDetail, detailss);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();

}

}

En ClienteFormularioFragment.java:

        private void camara() {
Intent intentCapture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intentCapture, fotografia);
}

        @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
              
        // NUNCA LLEGA A ESTE METODO !!!

        }

Juan de Dios Maldonado Sánchez

unread,
Feb 6, 2014, 2:52:48 AM2/6/14
to desarrollad...@googlegroups.com
Mírate la documentación y comprueba que el onActivityResult NO está disponible en la clase Fragment.


Donde está disponible es en el Activity desde donde se lanza el startActivityForResult. Verás como ahí sí que llega a llamarse. Sólo tienes que notificar al fragment que has recibido un resultado (en caso de que debas procesar el resultado en el fragment).


2014-02-05 Jorge Vidal <jvid...@gmail.com>:

--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/8h8ez2
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.
Para ver este debate en la Web, visita https://groups.google.com/d/msgid/desarrolladores-android/7fedd56a-75c3-450f-981a-c5f989ecfcf4%40googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Andres Villanueva

unread,
Mar 5, 2014, 12:39:48 PM3/5/14
to desarrollad...@googlegroups.com
Acá deberias sobreescribir el método onViewCreated

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);

Rodrigo Platero

unread,
Mar 6, 2014, 3:46:11 AM3/6/14
to desarrollad...@googlegroups.com
Juan de Dios, estás equivocado, el método onActivityResult existe en los fragmentos. El problema que hay (es un bug reportado a y conocido por Google, aunque sin resolver) es que cuando existen fragmentos anidados (nested fragments), que creo que es el caso que plantea Jorge, este método no se llama nunca.

La forma de solucionarlo es obligar a la activity (FragmentActivity) a que llame a dicho método (onActivityResult) del fragmento que se quiera, bien porque ese fragmento es único y se tiene una instancia de él en esa actividad, o bien obteniendo dicho fragmento mediante el FragmentManager (por tag o id).

Jorge, espero que te sirva un poco de guía para solucionar tu problema.

Rodrigo Platero Montero




--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/8h8ez2
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular tu suscripción a este grupo y dejar de recibir sus mensajes, envía un mensaje a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un mensaje a desarrollad...@googlegroups.com.

Juan de Dios Maldonado Sánchez

unread,
Mar 6, 2014, 4:11:55 AM3/6/14
to desarrollad...@googlegroups.com
Rodrigo, vale, a la hora de buscar el método en la URL de la documentación que puse en mi mensaje, me equivocaría a la hora de escribir la palabra de búsqueda y al no encontrarla, daría esa respuesta. (Es lo que tiene responder a toda prisa) Aun así...

Observa la respuesta que di:

"Sólo tienes que notificar al fragment que has recibido un resultado (en caso de que debas procesar el resultado en el fragment)."

Y ahora la que has dado tú:
"La forma de solucionarlo es obligar a la activity (FragmentActivity) a que llame a dicho método (onActivityResult) del fragmento que se quiera"

¿Cómo de distintas son?

"onActivityResult" NO debería de estar en la clase Fragment (y si lo está, que es el caso, no debería utilizarse), ya que destroza la idea de que los fragmentos sean independientes de la actividad en la que se ponen.


juande

unread,
Mar 6, 2014, 4:19:59 AM3/6/14
to desarrollad...@googlegroups.com
Se me olvidaba agradecerte que comentaras mi desliz. No quiero engañar a nadie. Como no me parecía lógico que estuviera ese método dentro de la clase Fragment, ni busqué dos veces. :)

Rodrigo Platero Montero




Para anular tu suscripción a este grupo y dejar de recibir sus mensajes, envía un mensaje a desarrolladores-android+unsub...@googlegroups.com.

Rodrigo Platero

unread,
Mar 7, 2014, 3:14:55 AM3/7/14
to desarrollad...@googlegroups.com
No pretendía dar a entender que engañases a nadie. Por lo demás, no estoy de acuerdo contigo en que no debería de estar en la clase fragment, pero de colores está lleno el mundo =)

Rodrigo Platero Montero




Para anular tu suscripción a este grupo y dejar de recibir sus mensajes, envía un mensaje a desarrolladores-a...@googlegroups.com.

Para publicar en este grupo, envía un mensaje a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android .
Reply all
Reply to author
Forward
0 new messages