I dug in deeper - turns out the datePicker needs to be created with an Activity
instance, and not a Context one. Additionally, the 1-parameter DatePickerDialog constructor is valid only in API 24 and up. So I used the API Level-1-compatible methods and constructors to ensure that the app would work on devices on the lower end. Finally I added a necessary user-permission in the AndroidManifest to be able to access the FragmentManager instance.
var Application = require('application');
var createViewModel = require("./main-view-model").createViewModel;
var View = require('ui/core/view').View;
var ctx = Application.android.context;
var DatePickerFrag = android.app.DialogFragment.extend({
onCreateDialog: function() {
var monthNames = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];
var onDateSetListener = new android.app.DatePickerDialog.OnDateSetListener({
onDateSet: function (DPView, year, month, day) {
console.log("Year: " + year + " Month: " + monthNames[month] + " Day: " + day);
}
});
var Calendar = java.util.Calendar;
var calendar = Calendar.getInstance();
var year = calendar.get(Calendar.YEAR);
var m = calendar.get(Calendar.MONTH);
var d = calendar.get(Calendar.DAY_OF_MONTH);
return new android.app.DatePickerDialog(Application.android.foregroundActivity /* Application.android.context */, onDateSetListener, year, m, d);
}
});
function onNavigatingTo(args) {
var page = args.object;
var fragmentManager = Application.android.foregroundActivity.getFragmentManager();
var dfrag = new DatePickerFrag();
// dfrag.onCreateDialog() - the android runtime does that, you don't want to invoke it manually
dfrag.show(fragmentManager, 'DatePicker');
page.bindingContext = createViewModel();
}
exports.onNavigatingTo = onNavigatingTo;
and the AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="__PACKAGE__"
android:versionCode="1"
android:versionName="1.0">
...
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
...
</manifest>