109 votes

Comment implémenter une vue AlertDialog personnalisée

Dans les docs sur Android AlertDialog, il donne les instructions suivantes et exemple pour un affichage personnalisé dans un AlertDialog:

Si vous souhaitez afficher un plus complexe, de rechercher le FrameLayout appelé "corps" et ajouter votre point de vue à elle:
FrameLayout fl = (FrameLayout) findViewById(R.id.body);
fl.add(myView, new LayoutParams(FILL_PARENT, WRAP_CONTENT));

Tout d'abord, il est assez évident que add() est une faute de frappe et est destiné à être addView().

Je suis confus par la première ligne à l'aide de R. id.corps. Il semble que c'est l'élément de corps de la AlertDialog ... mais je ne peux pas entrer dans mon code b/c il donne une erreur de compilation. D'où R. id.le corps s'défini ou affectés ou quoi?

Voici mon code. J'ai essayé d'utiliser setView(findViewById(R.layout.whatever) sur le constructeur, mais il ne fonctionne pas. Je suppose parce que je n'ai pas déployer manuellement?

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Title")
    .setCancelable(false)
    .setPositiveButton("Go", new DialogInterface.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int id) {
        EditText textBox = (EditText) findViewById(R.id.textbox);
        doStuff();
    }
});

FrameLayout f1 = (FrameLayout)findViewById(R.id.body /*CURRENTLY an ERROR*/);
f1.addView(findViewById(R.layout.dialog_view));

AlertDialog alert = builder.create();
alert.show();

159voto

Andrewx2 Points 1451

Vous pouvez créer votre vue directement à partir de Layout Inflater. Vous devez uniquement utiliser le nom de votre fichier XML de présentation et l'ID de la présentation dans le fichier.

Votre fichier XML doit avoir un identifiant comme celui-ci:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/dialog_layout_root"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:padding="10dp"
              >
 

Et vous pouvez ensuite définir votre mise en page sur le générateur avec les éléments suivants:

 LayoutInflater inflater = getLayoutInflater();
View dialoglayout = inflater.inflate(R.layout.dialog_layout, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(dialoglayout);
builder.show();
 

48voto

synic Points 12644

Vous avez raison, c'est parce que vous ne l'avez pas gonflé manuellement. Il semble que vous essayiez d'extraire le "corps" id de la présentation de votre activité, et cela ne fonctionnera pas.

Vous voulez probablement quelque chose comme ça:

 LayoutInflater inflater = getLayoutInflater();
FrameLayout f1 = (FrameLayout)alert.findViewById(android.R.id.body);
f1.addView(inflater.inflate(R.layout.dialog_view, f1, false));
 

21voto

John Rellis Points 142

android.R.id.custom renvoyait null pour moi. J'ai réussi à faire en sorte que cela fonctionne au cas où quelqu'un rencontrerait le même problème,

 AlertDialog.Builder builder = new AlertDialog.Builder(context)
            .setTitle("My title")
            .setMessage("Enter password");
final FrameLayout frameView = new FrameLayout(context);
builder.setView(frameView);

final AlertDialog alertDialog = builder.create();
LayoutInflater inflater = alertDialog.getLayoutInflater();
View dialoglayout = inflater.inflate(R.layout.simple_password, frameView);
alertDialog.show();
 

Pour référence, R.layout.simple_password est:

 <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

<EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/password_edit_view"
        android:inputType="textPassword"/>
<CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/show_password"
        android:id="@+id/show_password_checkbox"
        android:layout_gravity="left|center_vertical"
        android:checked="false"/>

</LinearLayout>
 

17voto

Dapp Points 261

Les documents Android ont été modifiés pour corriger les erreurs.

La vue à l'intérieur de AlertDialog s'appelle android.R.id.custom.

http://developer.android.com/reference/android/app/AlertDialog.html

12voto

Sergio Viudes Points 191
Désolé pour les problèmes que vous rencontrez.

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