Kmmp
Kmmp

Reputation: 85

Remove/Hide the day from date picker

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

Answers (2)

York Shen
York Shen

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

Effect.

Upvotes: 1

Akshay Raiyani
Akshay Raiyani

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;
}

enter image description here

Upvotes: 0

Related Questions