¿Hay un método que funcione como start fragment para el resultado?


Actualmente tengo un fragmento en una superposición. Esto es para iniciar sesión en el servicio. En la aplicación 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 llamaba 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 son alojado en una actividad en la API Honeycomb. Puedo conseguir el primer fragmento de trabajar, pero entonces necesito startActivityForResult(), la cual no es posible. ¿Hay algo en la línea de startFragmentForResult() en el que pueda arrancar un nuevo fragmento y, cuando haya terminado, hacer que devuelva un resultado al fragmento anterior?

Author: CACuzcatlan, 2011-07-19

7 answers

Todos los Fragmentos viven dentro de Actividades. Iniciar un Fragmento para un resultado no tiene mucho sentido, porque la Actividad que lo aloja siempre tiene acceso a él, y viceversa. Si el fragmento necesita pasar 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 sigue siendo accesible por ambos Fragmentos, y todo el mensaje que pasa puede simplemente pasar por la Actividad.

Sólo recuerda que siempre tienes comunicación entre un Fragmento y su Actividad. Comenzar y terminar con un resultado es el mecanismo para la comunicación entre las Actividades - Las Actividades pueden delegar cualquier información necesaria a sus Fragmentos.

 45
Author: LeffelMania,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-19 17:50:57

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

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

Puede hacer callback usando estos.

Fragment invoker = getTargetFragment();
if(invoker != null) {
    invoker.callPublicMethod();
}
 50
Author: nagoya0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-23 16:16:40

Mis 2 centavos.

Cambio entre fragmentos intercambiando un fragmento antiguo por uno nuevo usando hide y show/add (existing/new). Así que esta respuesta es para desarrolladores que usan fragmentos como yo.

Luego utilizo el método onHiddenChanged para saber que el fragmento antiguo se cambió a la parte posterior del nuevo. Véase el código a continuación.

Antes de dejar el nuevo fragmento, establezco un resultado en un parámetro global para ser consultado por el fragmento antiguo. 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;
    }
}
 4
Author: AlikElzin-kilaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-16 05:31:19

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 personalizar para establecer los valores o pasar los valores.

 1
Author: Summved Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-22 07:15:28

Existe una biblioteca de Android - FlowR que te permite iniciar fragmentos para obtener resultados.

Comenzando un fragmento para el resultado.

Flowr.open(RequestFragment.class)
    .displayFragmentForResults(getFragmentId(), REQUEST_CODE);

El manejo da como resultado 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");
        }
    }
}

Establecer el resultado en el fragmento.

Flowr.closeWithResults(getResultsResponse(resultCode, resultData));
 0
Author: Ragunath Jawahar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-06 05:24:00

La forma más fácil de devolver 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 fácilmente a los argumentos

@Override
public void onResume() {
    super.onResume();
    Bundle rgs = getArguments();
    if (args != null) 
        String data = rgs.getString("bundle_filter");
}
 0
Author: Kirk_hehe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-23 11:12:18

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

 -1
Author: KishanSolanki124,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-23 06:43:57