2011-07-19 13 views
61

Actualmente tengo un fragmento en una superposición. Esto es para iniciar sesión en el servicio. En la aplicación del teléfono, cada uno de los pasos que quiero mostrar en la superposición son sus propias pantallas y actividades. Hay 3 partes del proceso de inicio de sesión y cada una tenía su propia actividad que se llamó con startActivityForResult().¿Hay algún método que funcione como fragmento inicial para el resultado?

Ahora quiero hacer lo mismo utilizando fragmentos y una superposición. La superposición mostrará un fragmento correspondiente a cada actividad. El problema es que estos fragmentos están alojados en una actividad en Honeycomb API. Puedo conseguir que el primer fragmento funcione, pero entonces necesito iniciarActivityForResult(), que no es posible. ¿Hay algo en la línea de startFragmentForResult() donde puedo patear un nuevo fragmento y cuando está listo, devuelve un resultado al fragmento anterior?

Respuesta

40

Todos los Fragmentos viven dentro de Actividades. Comenzar un Fragmento por un resultado no tiene mucho sentido, porque la Actividad que lo alberga siempre tiene acceso a él, y viceversa. Si el Fragmento necesita transmitir un resultado, puede acceder a su Actividad y establecer su resultado y finalizarlo. En el caso de intercambiar Fragmentos en una sola Actividad, la Actividad todavía es accesible para ambos Fragmentos, y todo el envío de mensajes puede simplemente pasar por la Actividad.

Solo recuerda que siempre tienes comunicación entre un Fragmento y su Actividad. Comenzar y finalizar con un resultado es el mecanismo de comunicación entre Actividades: las Actividades pueden delegar cualquier información necesaria en sus Fragmentos.

+8

Además, al cargar un fragmento de otro, puede establecer el fragmento de destino y devolver la llamada al método 'onActivityResult' del fragmento principal si lo desea. – PJL

+2

Su respuesta es incompleta, los fragmentos están usando un ciclo de vida como actividades. Por lo tanto, no podemos pasar argumentos a través de métodos, pero debemos usar paquetes para pasar valores. Incluso si el fragmento establece un valor en alguna parte, necesitamos saber cuándo terminó. ¿Deberían los fragmentos anteriores obtener el valor cuando comienza/se reanuda? Esta es una idea Pero no hay una forma adecuada de almacenar el valor, el fragmento podría ser llamado por múltiples otros fragmentos/actividades. – Loenix

45

Si lo desea, hay algunos métodos para la comunicación entre los fragmentos,

setTargetFragment(Fragment fragment, int requestCode) 
getTargetFragment() 
getTargetRequestCode() 

devolución de llamada Puede usar estos.

Fragment invoker = getTargetFragment(); 
if(invoker != null) { 
    invoker.callPublicMethod(); 
} 
+5

¿Funciona esto incluso cuando se reemplaza un fragmento? – Ronnie

+0

No lo he confirmado, pero quizás funcione. por lo tanto, debe tener cuidado con las pérdidas de memoria causadas por referencias circulares al abusar de 'setTargetFragment()'. – nagoya0

+2

¡La mejor solución hasta ahora!Funciona muy bien cuando se tiene una actividad y una pila de fragmentos donde tratar de encontrar el fragmento correcto para notificar sería una pesadilla. Gracias –

3

Mis 2 centavos.

Cambio de fragmentos intercambiando un fragmento antiguo por uno nuevo usando ocultar y mostrar/agregar (existente/nuevo). Entonces esta respuesta es para desarrolladores que usan fragmentos como yo.

Luego uso el método onHiddenChanged para saber que el fragmento anterior se cambió para volver al nuevo. Vea el código a continuación.

Antes de abandonar el nuevo fragmento, configuré un resultado en un parámetro global para ser consultado por el fragmento anterior. Esta es una solución muy ingenua.

@Override 
public void onHiddenChanged(boolean hidden) { 
    super.onHiddenChanged(hidden); 
    if (hidden) return; 
    Result result = Result.getAndReset(); 
    if (result == Result.Refresh) { 
     refresh(); 
    } 
} 

public enum Result { 
    Refresh; 

    private static Result RESULT; 

    public static void set(Result result) { 
     if (RESULT == Refresh) { 
      // Refresh already requested - no point in setting anything else; 
      return; 
     } 
     RESULT = result; 
    } 

    public static Result getAndReset() { 
     Result result = RESULT; 
     RESULT = null; 
     return result; 
    } 
} 
+0

¿Qué es el método 'getAndReset()'? – EpicPandaForce

+0

Se agregó el código faltante (parte de él) para que tenga sentido. –

1

En su fragmento puede llamar a getActivity(). Esto le dará acceso a la actividad que creó el fragmento. Desde allí, puede llamar a su método personalizado para establecer los valores o pasar los valores.

Cuestiones relacionadas