54 votes

Android "Best Practice" renvoyer des valeurs à partir d'une boîte de dialogue

Quelle est la méthode "correcte" pour renvoyer les valeurs à l'activité appelante depuis une boîte de dialogue personnalisée complexe - par exemple, des champs de texte, un sélecteur de date ou d'heure, une série de boutons radio, etc., plus un bouton "Enregistrer" et un bouton "Annuler"?

Certaines des techniques que j'ai vues sur le web comprennent :

  • membres de données publics dans la classe dérivée de la boîte de dialogue qui peuvent être lus par l'activité

  • accesseurs "get" publics . . . " . . " . . "

  • Lancement de la boîte de dialogue avec un Intent (par opposition à show()) plus des gestionnaires dans la classe de la boîte de dialogue qui récupèrent les entrées des différents contrôles et les regroupent pour les renvoyer à l'activité, ainsi lorsque l'utilisateur appuie sur "Enregistrer", le groupe est renvoyé en utilisant ReturnIntent()

  • Écouteurs dans l'activité qui traitent les entrées des contrôles qui se trouvent dans la boîte de dialogue, par exemple, les écouteurs du TimePicker ou du DatePicker sont vraiment dans l'activité. Dans ce schéma, pratiquement tout le travail est effectué dans l'activité

  • Un écouteur dans l'activité pour le bouton "Enregistrer" et ensuite l'activité interroge directement les contrôles dans la boîte de dialogue ; l'activité ferme la boîte de dialogue.

...plus d'autres que j'ai déjà oubliées.

Y a-t-il une technique particulière considérée comme étant correcte ou "meilleure pratique"?

1voto

Braden Holt Points 474

Après avoir fait pas mal de recherches, j'ai opté pour une interface de rappel. Mon code est le suivant :

MyFragment.java

public class MyFragment extends Fragment {

...

private void displayFilter() {

    FragmentManager fragmentManager = getFragmentManager();

    FilterDialogFragment filterDialogFragment = new FilterDialogFragment();
    Bundle bundle = new Bundle();
    bundle.putSerializable("listener", new FilterDialogFragment.OnFilterClickListener() {
        @Override
        public void onFilterClickListener() {
            System.out.println("LISTENER CLICKED");

        }
    });
    filterDialogFragment.setArguments(bundle);
    filterDialogFragment.show(fragmentManager, DIALOG_FILTER);

}

MyDialog.java

public class MyDialog extends DialogFragment {

private ImageButton mBtnTest;
private OnFilterClickListener mOnFilterClickListener;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    // Récupérer le layout inflater
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View filterLayout = inflater.inflate(R.layout.filter_dialog, null);
    // Inflater et définir le layout pour la boîte de dialogue
    // Passer null en tant que vue parent car elle va dans la mise en page de la boîte de dialogue
    builder.setView(filterLayout)
            .setTitle("Filtre");

    Dialog dialog = builder.create();

    mOnFilterClickListener = (OnFilterClickListener) getArguments().getSerializable("listener");

    mBtnTest = (ImageButton)filterLayout.findViewById(R.id.fandb);
    mBtnTest.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            mOnFilterClickListener.onFilterClickListener();
            dismiss();
        }
    });

    return dialog;
}

public interface OnFilterClickListener extends Serializable {
    void onFilterClickListener();
}

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X