Reputation: 85
I have date picker on my application but I want to remove/hide the day in datepicker. Show only month and year. NOTE: I am using xamarin android.
This is my extend class for datepicker:
class DatePickerFragment : DialogFragment, DatePickerDialog.IOnDateSetListener
{
// TAG can be any string of your choice.
public static readonly string TAG = "X:" + typeof(DatePickerFragment).Name.ToUpper();
// Initialize this value to prevent NullReferenceExceptions.
Action<DateTime> _dateSelectedHandler = delegate { };
public static DatePickerFragment NewInstance(Action<DateTime> onDateSelected)
{
DatePickerFragment frag = new DatePickerFragment();
frag._dateSelectedHandler = onDateSelected;
return frag;
}
public override Dialog OnCreateDialog(Bundle savedInstanceState)
{
DateTime currently = DateTime.Now;
DatePickerDialog dialog = new DatePickerDialog(Activity,
this,
currently.Year,
currently.Month - 1,
currently.Day);
return dialog;
}
public void OnDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
{
// Note: monthOfYear is a value between 0 and 11, not 1 and 12!
DateTime selectedDate = new DateTime(year, monthOfYear + 1, dayOfMonth);
Log.Debug(TAG, selectedDate.ToLongDateString());
_dateSelectedHandler(selectedDate);
}
}
And this is my Activity class:
private void DateSelect_OnClick(object sender, EventArgs eventArgs)
{
DatePickerFragment frag = DatePickerFragment.NewInstance(delegate (DateTime time)
{
_dateDisplay.Text = time.ToLongDateString();
});
frag.Show(FragmentManager, DatePickerFragment.TAG);
}
Thank you!
Upvotes: 0
Views: 1963
Reputation: 9084
Remove/Hide the day from date picker
I test Akshay Raiyani's code, it works fine for my simulator(Android 6.0,7.0,7.1) but it didn't work some device, for example my MI 5, Android 7.0, it's weird.
So I implement a DialogFragment
embedding two NumberPickers
, it works fine for most Android device.
MonthYearPickerDialog :
public class MonthYearPickerDialog : DialogFragment
{
private const int MAX_YEAR = 2099;
private DatePickerDialog.IOnDateSetListener listener;
public void setListener(DatePickerDialog.IOnDateSetListener listener)
{
this.listener = listener;
}
public override Dialog OnCreateDialog(Bundle savedInstanceState)
{
AlertDialog.Builder builder = new AlertDialog.Builder(Activity);
// Get the layout inflater
LayoutInflater inflater = Activity.LayoutInflater;
Calendar cal = Calendar.Instance;
View dialog = inflater.Inflate(Resource.Layout.date_picker_dialog, null);
NumberPicker monthPicker = (NumberPicker)dialog.FindViewById(Resource.Id.picker_month);
NumberPicker yearPicker = (NumberPicker)dialog.FindViewById(Resource.Id.picker_year);
monthPicker.MinValue = 1;
monthPicker.MaxValue = 12;
monthPicker.Value = cal.Get(CalendarField.Month) + 1;
int year = cal.Get(CalendarField.Year);
yearPicker.MinValue = year;
yearPicker.MaxValue = MAX_YEAR;
yearPicker.Value = year;
builder.SetView(dialog)
.SetPositiveButton("Ok", (sender,e)=>
{
listener.OnDateSet(null, yearPicker.Value, monthPicker.Value, 0);
})
.SetNegativeButton("Cancel", (sender, e) =>
{
this.Dialog.Cancel();
});
return builder.Create();
}
}
date_picker_dialog.axml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal">
<NumberPicker
android:id="@+id/picker_month"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="20dp"
android:layout_marginRight="20dp">
</NumberPicker>
<NumberPicker
android:id="@+id/picker_year"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</NumberPicker>
</LinearLayout>
</LinearLayout>
When you want use it :
MonthYearPickerDialog pd = new MonthYearPickerDialog();
pd.setListener(this);
pd.Show(FragmentManager, "MonthYearPickerDialog");
Upvotes: 1
Reputation: 1323
check this code. its perfectly works for me
private DatePickerDialog createDialogWithoutDateField() {
myCalendar = Calendar.getInstance();
date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, monthOfYear);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateLabel();
}
};
dlg = new DatePickerDialog(ProfilePaymentInfo.this, date,
myCalendar.get(Calendar.YEAR),
myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH)) {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int day = getContext().getResources().getIdentifier("android:id/day", null, null);
myCalendar.add(Calendar.MONTH, 0);
myCalendar.add(Calendar.YEAR, 0);
dlg.getDatePicker().setMinDate(myCalendar.getTimeInMillis());
if (day != 0) {
View dayPicker = findViewById(day);
if (dayPicker != null) {
//Set Day view visibility Off/Gone
dayPicker.setVisibility(View.GONE);
}
}
}
};
return dlg;
}
Upvotes: 0