C'è un modo molto più semplice per ricevere un risultato da un DialogFragment.
Innanzitutto, in Attività, Frammento o FrammentoAttività è necessario aggiungere le seguenti informazioni:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// Stuff to do, dependent on requestCode and resultCode
if(requestCode == 1) { // 1 is an arbitrary number, can be any int
// This is the return result of your DialogFragment
if(resultCode == 1) { // 1 is an arbitrary number, can be any int
// Now do what you need to do after the dialog dismisses.
}
}
}
L' requestCode
è fondamentalmente l'etichetta int per il DialogFragment hai chiamato, ti faccio vedere come funziona in un secondo. ResultCode è il codice che rispedisci da DialogFragment indicando cosa è successo all'attività di attesa, al frammento o all'attività del frammento in corso.
Il prossimo pezzo di codice da inserire è la chiamata a DialogFragment. Un esempio è qui:
DialogFragment dialogFrag = new MyDialogFragment();
// This is the requestCode that you are sending.
dialogFrag.setTargetFragment(this, 1);
// This is the tag, "dialog" being sent.
dialogFrag.show(getFragmentManager(), "dialog");
Con queste tre righe stai dichiarando il tuo DialogFragment, impostando un requestCode (che chiamerà onActivityResult (...) una volta che il dialogo è stato chiuso, e poi stai mostrando la finestra di dialogo. È così semplice.
Ora, nel tuo DialogFragment devi solo aggiungere una riga direttamente prima di in dismiss()
modo da inviare un resultCode a onActivityResult ().
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, getActivity().getIntent());
dismiss();
Questo è tutto. Nota, il resultCode è definito come quello int resultCode
che ho impostato resultCode = 1;
in questo caso.
Ecco fatto, ora puoi inviare il risultato del tuo DialogFragment all'attività chiamante, al frammento o all'attività del frammento.
Inoltre, sembra che queste informazioni siano state pubblicate in precedenza, ma non è stato fornito un esempio sufficiente, quindi ho pensato di fornire maggiori dettagli.
MODIFICA 24/06/2016
Mi scuso per il codice fuorviante di cui sopra. Ma sicuramente non puoi ricevere il risultato dall'attività visto come la linea:
dialogFrag.setTargetFragment(this, 1);
imposta un obiettivo Fragment
e non Activity
. Quindi per fare questo è necessario usare implement an InterfaceCommunicator
.
Nel tuo DialogFragment
set una variabile globale
public InterfaceCommunicator interfaceCommunicator;
Crea una funzione pubblica per gestirla
public interface InterfaceCommunicator {
void sendRequestCode(int code);
}
Poi, quando si è pronti per inviare il codice di nuovo alla Activity
quando l' DialogFragment
è fatto in esecuzione, è sufficiente aggiungere la linea prima di dismiss();
tuo DialogFragment
:
interfaceCommunicator.sendRequestCode(1); // the parameter is any int code you choose.
Nella tua attività ora devi fare due cose, la prima è rimuovere quella riga di codice che non è più applicabile:
dialogFrag.setTargetFragment(this, 1);
Quindi implementa l'interfaccia e il gioco è fatto. Puoi farlo aggiungendo la seguente riga alla implements
clausola in cima alla tua classe:
public class MyClass Activity implements MyDialogFragment.InterfaceCommunicator
E poi @Override
la funzione nell'attività,
@Override
public void sendRequestCode(int code) {
// your code here
}
Si utilizza questo metodo di interfaccia proprio come si farebbe con il onActivityResult()
metodo. Tranne il metodo di interfaccia è per DialogFragments
e l'altro è per Fragments
.