android aplicaciones - Enviar datos de fragmentos anidados al fragmento principal




pdf manual (6)

en mi caso (new Fragment()).hello(); trabajando bien para que yo llame a otra función de fragmento

Tengo un Fragment FR1 que contiene varios Fragments Nested ; FRa , FRb , FRc . Estos Fragments Nested se cambian presionando los Buttons en el diseño de FR1 . Cada uno de los Fragments Nested tiene varios campos de entrada dentro de ellos; que incluyen cosas como EditTexts , NumberPickers y Spinners . Cuando mi usuario realiza y rellena todos los valores para los Fragments Nested , FR1 (el fragmento principal) tiene un botón de envío.

¿Cómo puedo, entonces, recuperar mis valores de mis Fragments Nested y ponerlos en FR1 ?

  1. Todas las Views son declaradas y manejadas programáticamente dentro de cada Fragment Nested .
  2. El Fragment principal, FR1 maneja la transacción de los Fragments Nested .

Espero que esta pregunta sea lo suficientemente clara y no estoy seguro si el código es necesario para publicar, pero si alguien siente lo contrario, puedo hacerlo.

EDIT 1:

Aquí es cómo agrego mis Fragments Nested :

tempRangeButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            getChildFragmentManager().beginTransaction()
                    .add(R.id.settings_fragment_tertiary_nest, tempFrag)
                    .commit();

        }
    });

    scheduleButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            getChildFragmentManager().beginTransaction()
                    .add(R.id.settings_fragment_tertiary_nest, scheduleFrag)
                    .commit();
        }
    });

    alertsButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            getChildFragmentManager().beginTransaction()
                    .add(R.id.settings_fragment_tertiary_nest, alertsFrag)
                    .commit();

        }
    });

    submitProfile.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            constructNewProfile();
        }
    });

donde mi método constructNewProfile() necesita los valores de mis Fragments Nested .

public Fragment tempFrag = fragment_profile_settings_temperature
        .newInstance();
public Fragment scheduleFrag= fragment_profile_settings_schedules
            .newInstance();
public Fragment alertsFrag = fragment_profile_settings_alerts
        .newInstance();

Lo anterior se refiere a los campos del fragmento principal; y cómo se crean inicialmente las instancias.


Puede usar getChildFragmentManager() y encontrar fragmentos anidados, obtenerlos y ejecutar algunos métodos para recuperar valores de entrada


La mejor forma de pasar datos entre fragmentos es utilizando Interface. Esto es lo que debe hacer: en su fragmento anidado:

public interface OnDataPass {
    public void OnDataPass(int i);
}

OnDataPass dataPasser;

@Override
public void onAttach(Activity a) {
    super.onAttach(a);
    dataPasser = (OnDataPass) a;
}

public void passData(int i) {
    dataPasser.OnDataPass(i);
}

En tu fragmento principal:

public class Fragment_Parent extends Fragment implements OnDataPass {
...

    @Override
    public void OnDataPass(int i) {
        this.input = i;
    }

    btnOk.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Fragment fragment = getSupportFragmentManager().findFragmentByTag("0");
            ((Fragment_Fr1) fragment).passData();
        }
    }

}

En lugar de usar la interfaz, puede llamar al fragmento hijo a continuación:

( (YourFragmentName) getParentFragment() ).yourMethodName();

Compruebe, por instanceOf antes de obtener el fragmento principal, que es mejor:

if (getParentFragment() instanceof ParentFragmentName) {
  getParentFragment().Your_parent_fragment_method();
}

Cosa que hice: usando menos fragmento cuando sea posible. Desafortunadamente, es posible en casi caso. Entonces, termino con muchos fragmentos y un poco de actividades. Algunos inconvenientes que me he dado cuenta:

  • ActionBar y menú: cuando 2 fragmentos tienen diferentes títulos, menús,
    será difícil de manejar. Ejemplo: cuando agrega un nuevo fragmento, puede cambiar el título de la barra de acción, pero cuando lo backstack de backstack no hay manera de restaurar el título antiguo. Es posible que necesite una barra de herramientas en cada fragmento para este caso, pero créanme, eso le llevará más tiempo.
  • Cuando necesitamos startForResult , la actividad tiene pero el fragmento no.
  • No tiene animación de transición por defecto

Mi solución para esto es usar una Actividad para envolver un fragmento dentro. Así que tenemos una barra de acción, menú, startActivityForResult , animación, ...





android android-fragments parameter-passing android-nested-fragment