90 votes

Mise en page personnalisée pour DialogFragment OnCreateView vs. OnCreateDialog

J'essaie de créer un DialogFragment en utilisant ma propre mise en page.

J'ai vu plusieurs approches différentes. Parfois, la disposition est définie dans OnCreateDialog comme ceci : (J'utilise Mono mais je me suis un peu habitué à Java)

public override Android.App.Dialog OnCreateDialog (Bundle savedInstanceState)
{
    base.OnCreateDialog(savedInstanceState);
    AlertDialog.Builder b = new AlertDialog.Builder(Activity);
        //blah blah blah
    LayoutInflater i = Activity.LayoutInflater;
    b.SetView(i.Inflate(Resource.Layout.frag_SelectCase, null));
    return b.Create();
}

Cette première approche fonctionne pour moi... jusqu'à ce que je veuille utiliser findViewByID. Après quelques recherches sur Internet, j'ai donc essayé la deuxième approche qui consiste à remplacer OnCreateView

J'ai donc commenté deux lignes de OnCreateDialog qui a défini la mise en page et ensuite ajouté ceci :

public override Android.Views.View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View v = inflater.Inflate(Resource.Layout.frag_SelectCase, container, false);
        //should be able to use FindViewByID here...
    return v;
}

ce qui me donne une belle erreur :

11-05 22:00:05.381: E/AndroidRuntime(342): FATAL EXCEPTION: main
11-05 22:00:05.381: E/AndroidRuntime(342): android.util.AndroidRuntimeException: requestFeature() must be called before adding content

Je suis perplexe.

7voto

Jason Hartley Points 706

Si vous voulez accéder facilement aux propriétés de la boîte de dialogue, comme le titre et le bouton de renvoi, mais que vous voulez également utiliser votre propre mise en page, vous pouvez utiliser un LayoutInflator avec votre Builder lorsque vous surchargez onCreateDialog.

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = getActivity().getLayoutInflater();
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setMessage("Message!")
        .setTitle(this.dialogTitle)
        .setView(inflater.inflate(R.layout.numpad_dialog, null))
        .setPositiveButton(R.string.enter, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                // Clicked 'Okay'
            }
        })
        .setNegativeButton(R.string.dismiss, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                // Clicked 'Cancel'
            }
        });
    return builder.create();
}

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