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:
- Crear
interface
(es decir, nombradoMyContract
) que contiene una firma de método para pasar los datos, es decirmethodToPassMyData(... data);
. - Asegúrese de que su
DialogFragment
cumple ese contrato (lo que generalmente significa implementar la interfaz):class MyFragment extends Fragment implements MyContract ....
- Sobre la creación de
DialogFragment
establece tu invocaciónFragment
como su fragmento de destino llamandomyDialogFragment.setTargetFragment(this, 0);
. Este es el objeto con el que hablarás más tarde. - En tus
DialogFragment
obtenga ese fragmento de invocación llamandogetTargetFragment();
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 esperarmethodToPassData()
estar alli. Si no, entonces obtendrá regularClassCastException
. 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. - Cuando llegue el momento de devolver los datos, llame
methodToPassMyData()
sobre el objeto que obtuviste anteriormente:((MyContract)getTargetFragment()).methodToPassMyData(data);
. Si tuonAttach()
ya emite y asigna el fragmento de destino a una variable de clase (es decir,mHost
), entonces este código sería solomHost.methodToPassMyData(data);
. - 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.