J'ai un ListFragment
avec un menu contextuel pour mes ListItem
s. Une des options de menu est pour la suppression de l'élément, et je veux montrer une boîte de dialogue de confirmation à l'utilisateur pour éviter les suppressions accidentelles.Interface DialogFragment qui peut être mis en œuvre dans les activités et fragments
public class MyListFragment extends ListFragment implements ConfirmDeletePopupFragment.DialogListener {
(...)
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_delete:
ConfirmDeletePopupFragment fragment = new ConfirmDeletePopupFragment();
fragment.show(getSupportFragmentManager(), "tag");
return true;
case R.id.action_cancel:
return true;
default:
return super.onContextItemSelected(item);
}
}
}
Pour une situation similaire, j'ai créé une boîte de dialogue de confirmation générique comme DialogFragment
comme indiqué ci-dessous. Ce que je peux utiliser pour laisser l'utilisateur confirmer toute action critique. Pour une utilisation dans un Activity
il a une interface avec une méthode onDeleteConfirm
qui gère la suppression réelle dans le Activity
qui a créé le dialogue.
public class ConfirmDeletePopupFragment extends DialogFragment {
(...)
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mDialogListener = (DialogListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(getTargetFragment().toString() + " must implement ConfirmDeletePopupFragment.DialogListener");
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final android.app.AlertDialog.Builder dialogBuilder = new android.app.AlertDialog.Builder(getActivity());
final LayoutInflater inflater = getActivity().getLayoutInflater();
final View dialogView = inflater.inflate(R.layout.popup_confirm_delete, null);
dialogBuilder.setView(dialogView);
dialogBuilder.setTitle("Delete?");
dialogBuilder.setNegativeButton(getString(R.string.activities_confirm_deletion_cancel_button), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
});
dialogBuilder.setPositiveButton(getString(R.string.activities_confirm_deletion_delete_button), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
((DialogListener) getActivity()).onDeleteConfirm();
}
});
deleteDialog = dialogBuilder.create();
deleteDialog.show();
return deleteDialog;
}
public interface DialogListener {
void onDeleteConfirm();
}
}
De toute évidence, cette interface ne fonctionne que lorsque la boîte de dialogue est créé dans un Activity
(((DialogListener) getActivity()).onDeleteConfirm();
). Pour le problème mentionné ci-dessus, je dois créer la boîte de dialogue à partir d'un Listfragment
, et juste implémentant l'interface de dialogue dans le ListFragment
ne fonctionne pas (« Activité doit mettre en œuvre ConfirmDeletePopupFragment.DialogListener »)
Quelle serait la meilleure façon de adapter mon DialogFragment
de sorte qu'il contienne les deux cas (créé en Activity
ou Fragment
)?