Ho incontrato un po 'di un posto di blocco. Ho uno scenario MOLTO simile a quello descritto a: DialogFragment - retaining listener after screen rotationCome conservare il listener nella finestra di dialogo personalizzata aperta dal frammento?
La soluzione proposta funziona bene per l'autore perché il suo dialogo viene chiamato da un'attività. Il mio caso è esattamente lo stesso, ma la mia finestra di dialogo personalizzata è chiamata da un frammento anziché da un'attività. (IE Activity-> Fragment-> Dialog)
ho implementato la stessa soluzione (impostando l'ascoltatore in onResume dal chiamante frammento), ma non funziona in questo caso.
Quello che sembra accadere è che quando lo schermo viene ruotato, Android uccide la finestra di dialogo e il frammento. Quindi li ricrea IN QUEL ORDINE. Quindi, quando il mio onCreateDialog viene chiamato sulla mia finestra di dialogo personalizzata, il frammento contenente deve ancora essere ricreato, quindi ha null per il listener da impostare per i pulsanti positivi e negativi.
Qualcuno sa un modo per aggirare questo?
Posso postare codice se qualcuno pensa che sarebbe necessario, ma è praticamente lo stesso del codice sul thread collegato.
aggiornato con CODICE:
public class RecipeDetailEditFragment extends SherlockFragment implements DialogInterface.OnClickListener {
private EditStepFragmentDialog stepDialog;
private Recipe newRecipe; //main data object implements parcelable
...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
stepDialog = EditStepFragmentDialog.newInstance(newRecipe);
//I've also tried passing 'this' into the newInstance constructor and
//setting the listener there, but that doesn't work either
}
public void onResume() {
stepDialog.setListener(this);
super.onResume();
}
...
}
public class EditStepFragmentDialog extends DialogFragment {
private DialogInterface.OnClickListener ocl;
private static final String ARG_RECIPE = "recipe";
private Recipe recipe;
public EditStepFragmentDialog() {}
public static EditStepFragmentDialog newInstance(Recipe rec) { //(Recipe rec, DialogInterface.OnClickListener oc) as mentioned doesn't work.
EditStepFragmentDialog dia = new EditStepFragmentDialog();
Bundle args = new Bundle();
args.putParcelable(ARG_RECIPE, rec);
//dia.setListener(oc);
return dia;
}
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder adb = new AlertDialog.Builder(getActivity());
if (getArguments().containsKey(ARG_RECIPE)) {
recipe = (Recipe) getArguments().getParcelable(ARG_RECIPE);
}
...
adb.setPositiveButton("Done", ocl);
adb.setNegativeButton("Cancel", ocl);
...
return adb.create();
}
public void setListener(DialogInterface.OnClickListener cl) {
ocl = cl;
}
}
Dovrai inserire il codice – Atomix