android - studio - ¿Hay algún método que funcione como fragmento de inicio para el resultado?
llamar un fragment desde un activity (5)
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 ().
Ahora quiero hacer lo mismo usando 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?
En tu fragmento puedes 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.
Hay una biblioteca de Android - FlowR que le permite iniciar fragmentos para obtener resultados.
Comenzando un fragmento para el resultado.
Flowr.open(RequestFragment.class)
.displayFragmentForResults(getFragmentId(), REQUEST_CODE);
Manejo de resultados en el fragmento de llamada.
@Override
protected void onFragmentResults(int requestCode, int resultCode, Bundle data) {
super.onFragmentResults(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) {
demoTextView.setText("Result OK");
} else {
demoTextView.setText("Result CANCELED");
}
}
}
Estableciendo el resultado en el Fragmento.
Flowr.closeWithResults(getResultsResponse(resultCode, resultData));
Mis 2 centavos.
Cambio entre 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 utilizo el método onHiddenChanged
para saber que el antiguo fragmento se cambió para volver al nuevo. Vea el código a continuación.
Antes de abandonar el nuevo fragmento, establezco un resultado en un parámetro global que el fragmento anterior debe consultar. 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;
}
}
Si lo desea, existen algunos métodos para la comunicación entre Fragmentos,
setTargetFragment(Fragment fragment, int requestCode)
getTargetFragment()
getTargetRequestCode()
Puede hacer una devolución de llamada usando estos.
Fragment invoker = getTargetFragment();
if(invoker != null) {
invoker.callPublicMethod();
}
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.