La meilleure approche est sans aucun doute l'utilisation de DialogFragment.
Voici ma solution de classe wrapper qui permet d'éviter que différents dialogues soient rejetés dans un même Fragment (ou Activité avec une petite refactorisation). De plus, cela permet d'éviter une refactorisation massive du code si, pour une raison ou une autre, il y a beaucoup d'activités de type AlertDialogs
éparpillés parmi le code avec de légères différences entre eux en termes d'actions, d'apparence ou autre.
public class DialogWrapper extends DialogFragment {
private static final String ARG_DIALOG_ID = "ARG_DIALOG_ID";
private int mDialogId;
/**
* Display dialog fragment.
* @param invoker The fragment which will serve as {@link AlertDialog} alert dialog provider
* @param dialogId The ID of dialog that should be shown
*/
public static <T extends Fragment & DialogProvider> void show(T invoker, int dialogId) {
Bundle args = new Bundle();
args.putInt(ARG_DIALOG_ID, dialogId);
DialogWrapper dialogWrapper = new DialogWrapper();
dialogWrapper.setArguments(args);
dialogWrapper.setTargetFragment(invoker, 0);
dialogWrapper.show(invoker.getActivity().getSupportFragmentManager(), null);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDialogId = getArguments().getInt(ARG_DIALOG_ID);
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return getDialogProvider().getDialog(mDialogId);
}
private DialogProvider getDialogProvider() {
return (DialogProvider) getTargetFragment();
}
public interface DialogProvider {
Dialog getDialog(int dialogId);
}
}
En ce qui concerne l'activité, vous pouvez invoquer getContext()
à l'intérieur de onCreateDialog()
et l'envoyer au DialogProvider
et demander un dialogue spécifique en mDialogId
. Toute logique de traitement d'un fragment cible doit être supprimée.
Utilisation d'un fragment :
public class MainFragment extends Fragment implements DialogWrapper.DialogProvider {
private static final int ID_CONFIRMATION_DIALOG = 0;
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
Button btnHello = (Button) view.findViewById(R.id.btnConfirm);
btnHello.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogWrapper.show(MainFragment.this, ID_CONFIRMATION_DIALOG);
}
});
}
@Override
public Dialog getDialog(int dialogId) {
switch (dialogId) {
case ID_CONFIRMATION_DIALOG:
return createConfirmationDialog(); //Your AlertDialog
default:
throw new IllegalArgumentException("Unknown dialog id: " + dialogId);
}
}
}
Vous pouvez lire l'article complet sur mon blog Comment éviter que la boîte de dialogue soit rejetée ? et jouer avec le code source .
1 votes
Comment enregistrer/restaurer le contenu de l'EditText modifié ? Pouvez-vous montrer un peu de code ?
0 votes
J'ai compris le problème, j'avais oublié de récupérer la vue par Id après avoir réinitialisé la mise en page.