2017-10-19 27 views
0

J'ai une activité dans mon application, où je veux que l'utilisateur choisisse la date d'un DatePicker, qui est contenue dans un AlertDialog. Dans le AlertDialog, j'ai défini une vue, à un fichier de mise en page xml (, qui contient uniquement un LinearLayout, avec un seul DatePicker.)Android Studio - DatePicker dans AlertDialog, référence d'objet null

Le code est vraiment simple, et ressemble à ceci, juste en dessous de onCreate().

AlertDialog.Builder alert = new AlertDialog.Builder(this); 
alert.setView(R.layout.activity_alertdialog_date); 
DatePicker datePicker = (DatePicker) findViewById(R.id.Activity_AlertDialog_SetStartDate); 
// ... The rest of the AlertDialog, with buttons and all that stuff 
alert.create().show() 

la mise en page apparaît dans le AlertDialog, et cette partie fonctionne très bien. Cependant, lorsque je tente d'ajouter cette ligne, je reçois une erreur de référence d'objet nul.

datePicker.setMinDate(System.currentTimeMillis() - 1000); 

Voici l'erreur message

tentative d'invoquer la méthode virtuelle « vide android.widget.DatePicker.setMinDate (long) » sur une référence d'objet nul

Comment puis-je résoudre ce problème, ou d'améliorer mon code d'une autre manière? J'apprécie vraiment toute l'aide que je peux obtenir. Merci!

+0

Où essayez-vous d'utiliser cette ligne 'datePicker.setMinDate (System.currentTimeMillis() - 1000);'? Est-ce que 'datePicker' est dans la portée? – DigitalNinja

+0

C'est la ligne suivante. Tout cela est dans une méthode que j'appelle à la fin de onCreate(). Donc j'appelle la méthode dans la ligne juste en dessous de setContentView (...) – Fred

+1

Sidenote à la question: vous pouvez enchaîner vos appels AlertDialog.Builder, ie 'AlertDialog.Builder (this) .setView (R.layout.my_layout) .setButtonPositive (R.string.sweet_text) .create(). show() 'pour rendre votre code un peu plus lisible. – emerssso

Répondre

1

Votre problème est que votre findViewById recherche au mauvais endroit pour la vue DatePicker. Appeler findViewById dans une activité l'appellera sur la hiérarchie de mise en page de l'activité, pas sur la mise en page de la boîte de dialogue. Vous devez d'abord gonfler la disposition de la boîte de dialogue d'alerte, puis obtenir une référence à la vue. Cela peut être réalisé de plusieurs façons.

Probablement le plus simple est de gonfler la vue et obtenir la référence avant d'afficher la boîte de dialogue:

View dialogView = LayoutInflater.from(this).inflate(R.layout.activity_alertdialog_date, false); 
DatePicker datePicker = (DatePicker) dialogView.findViewById(R.id.Activity_AlertDialog_SetStartDate); 

AlertDialog.Builder alert = new AlertDialog.Builder(this); 
alert.setView(dialogView); 
// ... The rest of the AlertDialog, with buttons and all that stuff 
alert.create().show(); 

Vous pouvez également obtenir la vue de la boîte de dialogue d'alerte après qu'il a été créé:

AlertDialog.Builder alert = new AlertDialog.Builder(this); 
alert.setView(R.id.Activity_AlertDialog_SetStartDate); 
// ... The rest of the AlertDialog, with buttons and all that stuff 
AlertDialog dialog = alert.create(); 

dialog.show(); 
DatePicker datePicker = (DatePicker) dialog.findViewById(R.id.Activity_AlertDialog_SetStartDate); 
+0

Parfait, merci! – Fred