2016-05-18 1 views
1

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)?

Répondre

2

la présentation de dialogue (dans le fragment):

<dialog>.setTargetFragment(<your fragment>); 
<dialog>.show(); 

Dans l'activité de saut setTargetFragment.

Dans le code DialogFragment:

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    if (getTargetFragment() != null) { 
     myInterface = (YourCastInterface) getTargetFragment(); 
    } else { 
     myInterface = (YourCastInterface) activity; 
    } 
}