2017-10-19 2 views
0

Ich habe eine Aktivität in meiner App, wo ich möchte, dass der Benutzer das Datum aus einem DatePicker auswählen, der in einem AlertDialog enthalten ist. Im AlertDialog habe ich eine Sicht auf eine XML-Layout-Datei (, die nur eine LinearLayout enthält, mit einem einzigen DatePicker.Android Studio - DatePicker in AlertDialog, Nullobjekt Referenz

) Der Code ist wirklich einfach und sieht so aus, direkt unter 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() 

das Layout zeigt in dem Alertdialog auf, und dieser Teil funktioniert super. Allerdings, wenn ich versuche, diese Zeile hinzufügen, ich habe einen null-Objekt Referenz-Fehler.

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

Hier ist der Fehler Nachricht:

Versuch virtuelle Methode 'Leere android.widget.DatePicker.setMinDate (long)' auf einer Null-Objekt Referenz

Wie kann ich dieses Problem beheben zu berufen, oder meinen Code in einer anderen Art und Weise zu verbessern? Ich schätze wirklich alle Hilfe, die ich bekommen kann. Vielen Dank!

+0

Wo Versuchen Sie, diese Zeile 'datePicker.setMinDate (System.currentTimeMillis() - 1000) zu verwenden;'? Ist 'datePicker' im Geltungsbereich? – DigitalNinja

+0

Es ist die nächste Zeile. Das ist alles in einer Methode, die ich am Ende von onCreate() anrufe. Also rufe ich die Methode in der Zeile unterhalb von setContentView (...) – Fred

+1

Nebenbemerkung zur Frage: Sie können Ihre AlertDialog.Builder-Aufrufe verketten, dh 'AlertDialog.Builder (this) .setView (R.layout.my_layout) .setButtonPositive (R.string.sweet_text) .create(). show() ', um Ihren Code etwas lesbarer zu machen. – emerssso

Antwort

1

Ihr Problem ist, dass Ihr findViewById an der falschen Stelle für die DatePicker-Ansicht sucht. Wenn Sie in einer Aktivität findViewById aufrufen, wird sie in der Layouthierarchie der Aktivität aufgerufen, nicht im Layout des Dialogfelds. Sie müssen zuerst das Layout für den Alarmdialog aufblasen und dann einen Verweis auf die Ansicht erhalten. Dies kann auf verschiedene Arten erreicht werden.

Wahrscheinlich ist die einfachste die Ansicht aufzublasen und die Referenz erhalten, bevor Sie den Dialog zeigt:

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(); 

Sie auch den Blick von der Warnmeldung bekommen konnte, nachdem es erstellt wurde:

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

Perfekt, danke! – Fred

Verwandte Themen