Saltar al contenido

¿Cómo enviar datos de DialogFragment a un Fragmento?

Este grupo de trabajo ha estado mucho tiempo buscando para darle respuesta a tu pregunta, te dejamos la soluciones y nuestro deseo es resultarte de gran apoyo.

Solución:

NOTA: además de una o dos llamadas específicas de Android Fragment, esta es una receta genérica para la implementación del intercambio de datos entre componentes débilmente acoplados. Puede usar este enfoque de manera segura para intercambiar datos entre literalmente cualquier cosa, ya sean fragmentos, actividades, diálogos o cualquier otro elemento de su aplicación.


Aquí está la receta:

  1. Crear interface (es decir, nombrado MyContract) que contiene una firma de método para pasar los datos, es decir methodToPassMyData(... data);.
  2. Asegúrese de que su DialogFragment cumple ese contrato (lo que generalmente significa implementar la interfaz): class MyFragment extends Fragment implements MyContract ....
  3. Sobre la creación de DialogFragment establece tu invocación Fragment como su fragmento de destino llamando myDialogFragment.setTargetFragment(this, 0);. Este es el objeto con el que hablarás más tarde.
  4. En tus DialogFragmentobtenga ese fragmento de invocación llamando getTargetFragment(); y envíe el objeto devuelto a la interfaz de contrato que creó en el paso 1, haciendo lo siguiente: MyContract mHost = (MyContract)getTargetFragment();. Casting nos permite asegurarnos de que el objeto de destino implemente el contrato necesario y podemos esperar methodToPassData() estar alli. Si no, entonces obtendrá regular ClassCastException. Por lo general, esto no debería suceder, a menos que esté haciendo demasiada codificación de copiar y pegar 🙂 Si su proyecto usa código externo, bibliotecas o complementos, etc. y en tal caso, debería capturar la excepción y decirle al usuario, es decir, el complemento no es compatible en lugar de dejando que la aplicación se cuelgue.
  5. Cuando llegue el momento de devolver los datos, llame methodToPassMyData() sobre el objeto que obtuviste anteriormente: ((MyContract)getTargetFragment()).methodToPassMyData(data);. Si tu onAttach() ya emite y asigna el fragmento de destino a una variable de clase (es decir, mHost), entonces este código sería solo mHost.methodToPassMyData(data);.
  6. Voila. Acaba de pasar con éxito sus datos del diálogo al fragmento de invocación.

Aquí hay otra receta sin usar ninguna interfaz. Simplemente haciendo uso de la setTargetFragment y Bundle para pasar datos entre DialogFragment y Fragment.

public static final int DATEPICKER_FRAGMENT = 1; // class variable

1. Llame al DialogFragment Como se muestra abajo:

// create dialog fragment
DatePickerFragment dialog = new DatePickerFragment();

// optionally pass arguments to the dialog fragment
Bundle args = new Bundle();
args.putString("pickerStyle", "fancy");
dialog.setArguments(args);

// setup link back to use and display
dialog.setTargetFragment(this, DATEPICKER_FRAGMENT);
dialog.show(getFragmentManager().beginTransaction(), "MyProgressDialog")

2. Usa el extra Bundle en un Intent en el DialogFragment para pasar cualquier información al fragmento de destino. El siguiente código en Button#onClick() evento de DatePickerFragment pasa una cadena y un entero.

Intent i = new Intent()
        .putExtra("month", getMonthString())
        .putExtra("year", getYearInt());
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, i);
dismiss();

3. Uso CalendarFragment‘s onActivityResult() método para leer los valores:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    switch (requestCode) 
        case DATEPICKER_FRAGMENT:
            if (resultCode == Activity.RESULT_OK) 
                Bundle bundle = data.getExtras();
                String mMonth = bundle.getString("month", Month);
                int mYear = bundle.getInt("year");
                Log.i("PICKER", "Got year=" + year + " and month=" + month + ", yay!");
             else if (resultCode == Activity.RESULT_CANCELED) 
                ...
            
            break;
    

Aquí hay un enfoque que ilustra la respuesta de Marcin implementada en kotlin.

1. Cree una interfaz que tenga un método para pasar datos en su clase dialogFragment.

interface OnCurrencySelected
    fun selectedCurrency(currency: Currency)

2. Agregue su interfaz en su constructor de fragmentos de diálogo.

class CurrencyDialogFragment(val onCurrencySelected :OnCurrencySelected)    :DialogFragment() 

3.Ahora haga que su Fragmento implemente la interfaz que acaba de crear

class MyFragment : Fragment(), CurrencyDialogFragment.OnCurrencySelected 

override fun selectedCurrency(currency: Currency) 
//this method is called when you pass data back to the fragment

4. Luego, para mostrar su fragmento de diálogo, solo llame
CurrencyDialogFragment(this).show(fragmentManager,"dialog"). this es el objeto de interfaz con el que hablará, para devolver datos a su Fragmento.

5. Cuando desee enviar datos a su Fragmento, simplemente llame al método para pasar datos en el objeto de interfaz que pasó en el constructor de dialogFragment.

onCurrencySelected.selectedCurrency(Currency.USD)
dialog.dismiss()

Comentarios y puntuaciones

Si te gusta el tema, eres capaz de dejar un escrito acerca de qué le añadirías a esta reseña.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *