¿Hay algún método que funcione como fragmento de inicio para el resultado?

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?

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.

Si lo desea, existen algunos métodos para la comunicación entre Fragmentos,

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

Puede hacer una callback usando estos.

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

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

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

Puedes usar EventBus . Simplifica la comunicación entre Actividades, Fragmentos, Hilos, Servicios, etc. Menos código, mejor calidad.

La forma más sencilla de pasar los datos es mediante setArgument (). Por ejemplo, tiene fragment1 que llama a fragment2 que llama a fragment3, fragment1 -> framgnet2 -> fargment3

En fragmento1

 public void navigateToFragment2() { if (fragmentManager == null) return; Fragment2 fragment = Fragment2.newInstance(); String tag = "Fragment 2 here"; fragmentManager.beginTransaction() .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) .add(R.id.flContent, fragment, tag) .addToBackStack(null) .commitAllowingStateLoss(); } 

En fragment2 llamamos fragment3 como de costumbre

 private void navigateToFragment3() { if (fragmentManager == null) return; Fragment3 fragment = new Fragment3(); fragmentManager.beginTransaction() .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) .replace(R.id.flContent, fragment, tag) .addToBackStack(null) .commit(); } 

Cuando terminamos nuestra tarea en fragment3 ahora llamamos así:

 FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); if (fragmentManager == null) return; fragmentManager.popBackStack(); Bundle bundle = new Bundle(); bundle.putString("bundle_filter", "data"); fragmentManager.findFragmentByTag("Fragment 2 here").setArguments(bundle); 

Ahora en fragment2 podemos llamar argumentos fácilmente

 @Override public void onResume() { super.onResume(); Bundle rgs = getArguments(); if (args != null) String data = rgs.getString("bundle_filter"); }