Dans la documentation Android sur AlertDialog , il donne les instructions et l'exemple suivants pour définir une vue personnalisée dans un AlertDialog:
Si vous souhaitez afficher une vue plus complexe, recherchez le FrameLayout appelé "body" et ajoutez-y votre vue:
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()
c'est une faute de frappe et qu'elle est censée l'être addView()
.
Je suis confus par la première ligne utilisant R.id.body. Il semble que ce soit l'élément body de AlertDialog ... mais je ne peux pas simplement entrer cela dans mon code car cela donne une erreur de compilation. Où R.id.body est-il défini ou attribué ou autre?
Voici mon code. J'ai essayé d'utiliser setView(findViewById(R.layout.whatever)
sur le constructeur mais cela n'a pas fonctionné. Je suppose que je ne l'ai pas gonflé 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();
android
android-alertdialog
stormin986
la source
la source
.setView(getLayoutInflater().inflate(R.layout.dialog_view, null))
au constructeur. Crédit à Sergio Viudes, ci-dessous.Réponses:
Vous avez raison, c'est parce que vous ne l'avez pas gonflé manuellement. Il semble que vous essayez «d'extraire» l'identifiant «corps» de la mise en page de votre activité, et cela ne fonctionnera pas.
Vous voulez probablement quelque chose comme ça:
la source
builder.setView(inflater.inflate(R.id.dialog, ROOT_VIEWGROUP[, ATTACH_TO_ROOT]))
, la documentation indique que le groupe de vues racine est facultatif. Doit-il être utilisé dans ce cas? Si tel est le cas ... vous devez encore trouver comment obtenir une référence à AlertDialog ...View
vous gonflez. Faites appelfindViewById()
à celaView
lorsque vous avez besoin d'éléments de son contenu. Voir: github.com/commonsguy/cw-android/tree/master/Database/ConstantsVous pouvez créer votre vue directement à partir du Layout Inflater, il vous suffit d'utiliser le nom de votre fichier XML de mise en page et l'ID de la mise en page dans le fichier.
Votre fichier XML doit avoir un identifiant comme celui-ci:
Et puis vous pouvez définir votre mise en page sur le générateur avec le code suivant:
la source
getCurrentFocus()
retournera le EditText et un EditText ne peut pas être casté en ViewGroup. L'utilisationnull
comme deuxième argument résout ce problème.android.R.id.custom renvoyait null pour moi. J'ai réussi à faire fonctionner cela au cas où quelqu'un rencontrerait le même problème,
Pour référence, R.layout.simple_password est:
la source
FrameLayout
comme une sorte de fragment? Lorsque j'ai essayé la réponse d'Andrewx2 ci-dessus, j'ai eu une erreur car il pensait que je gonflais deux mises en page (c'est mon estimation).Les documents Android ont été modifiés pour corriger les erreurs.
La vue à l'intérieur du AlertDialog est appelée
android.R.id.custom
http://developer.android.com/reference/android/app/AlertDialog.html
la source
Cela a fonctionné pour moi:
la source
AlertDialog personnalisé
Cet exemple complet inclut le renvoi de données à l'activité.
Créer une mise en page personnalisée
Une mise en page avec un
EditText
est utilisée pour cet exemple simple, mais vous pouvez la remplacer par tout ce que vous voulez.custom_layout.xml
Utiliser la boîte de dialogue dans le code
Les éléments clés sont
setView
pour attribuer la mise en page personnalisée auAlertDialog.Builder
Ceci est le code complet de l'exemple de projet montré dans l'image ci-dessus:
MainActivity.java
Remarques
DialogFragment
sous - classe comme décrit dans la documentation .Voir également
la source
EditText editText = customLayout.findViewById(R.id.editText);
devrait êtreEditText editText = (EditText) customLayout.findViewById(R.id.editText);
Les lignes de code les plus simples qui fonctionnent pour moi sont les suivantes:
Quel que soit le type de mise en page (LinearLayout, FrameLayout, RelativeLayout) fonctionnera
setView
et différera simplement dans l'apparence et le comportement.la source
Le moyen le plus simple de le faire est d'utiliser
android.support.v7.app.AlertDialog
au lieu deandroid.app.AlertDialog
wherepublic AlertDialog.Builder setView (int layoutResId)
can be used below API 21.la source
AlertDialog.setView(View view)
ajoute la vue donnée au fichierR.id.custom FrameLayout
. Ce qui suit est un extrait de code source Android à partirAlertController.setupView()
duquel finalement gère cela (mView
est la vue donnée à laAlertDialog.setView
méthode).la source
Après avoir changé l'ID android.R.id.custom, j'ai dû ajouter ce qui suit pour que la vue s'affiche:
Cependant, cela a provoqué le rendu de la nouvelle vue dans une grande vue parent sans arrière-plan, ce qui a divisé la boîte de dialogue en deux parties (texte et boutons, avec la nouvelle vue entre les deux). J'ai enfin obtenu l'effet que je voulais en insérant ma vue à côté du message:
J'ai trouvé cette solution en explorant l'arborescence des vues avec View.getParent () et View.getChildAt (int). Pas vraiment content non plus. Rien de tout cela ne se trouve dans les documents Android et s'ils modifient un jour la structure de AlertDialog, cela pourrait casser.
la source
Il serait plus logique de le faire de cette façon, avec le moins de code possible.
Pour obtenir une liste étendue des éléments que vous pouvez définir, commencez à taper
.set
dans Android Studiola source