如何为出生日期选择

时间:2017-10-18 13:49:50

标签: android android-datepicker

使用默认显示,DatePicker显示当前月份,但用户可能希望选择之前数百个月的日期。当然可以点击年份并选择出生年份,但许多用户并未意识到这一点,并且大多数用户都会点击几个月来选择出生日期。这引起了很大的挫折。

有没有办法配置Android DatePicker,以便在打开时要求用户先选择年份?或者有没有办法显示月份,以便用户可以更快地浏览它们而不是点击?或者是否真的有必要在日期选择器之前创建一个UI,要求他们选择DatePicker打开前的年份?我发现DatePicker用于选择日期前一段时间非常差,因为它的易用性需要使用许多用户都不知道的功能。

3 个答案:

答案 0 :(得分:2)

下面的DatePicker上的最后三个属性可以解决这个问题,因为它会从" Calendar"中切换DatePicker。查看使用三个微调器的年,月和日:

<DatePicker
    android:id="@+id/datePicker"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:calendarViewShown="false"
    android:datePickerMode="spinner"
    android:spinnersShown="true"
    >

答案 1 :(得分:0)

我只能找到该库作为适当的解决方案,可惜Google搞砸了:

https://github.com/drawers/SpinnerDatePicker

答案 2 :(得分:0)

这是您可以做的:

Styles.xml

<style name="CustomDatePickerDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:dialogTheme">@style/MyDialogTheme</item>
    <item name="android:datePickerStyle">@style/MyDatePicker</item>
</style>

<style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog">
    <item name="android:datePickerStyle">@style/MyDatePicker</item>
</style>

<style name="MyDatePicker" parent="@android:style/Widget.Material.DatePicker">
    <item name="android:datePickerMode">spinner</item>
</style>

定义一个新类,该类代表一个将显示DatePicker的DialogFragment:

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
private final Calendar c = Calendar.getInstance();
private DatePickerListener listener;

public DatePickerFragment() {
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    int customStyle = -1;

    Bundle arguments = getArguments();
    if (arguments != null)
        customStyle = arguments.getInt("customStyle", -1);

    int year = c.get(Calendar.YEAR);
    int month = c.get(Calendar.MONTH);
    int day = c.get(Calendar.DAY_OF_MONTH);

    if (customStyle != -1)
        return new DatePickerDialog(getActivity(), customStyle, this, year, month, day);
    else
        return new DatePickerDialog(getActivity(), this, year, month, day);
}

@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
    if (listener != null) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy", Locale.US);

        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, month);
        c.set(Calendar.DAY_OF_MONTH, dayOfMonth);

        String data = sdf.format(c.getTime());

        listener.onDatePicked(data);
    }
}

public void setDatePickerListener(DatePickerListener listener) {
    this.listener = listener;
}

public interface DatePickerListener {
    void onDatePicked(String date);
}
}

在您的活动或片段中,添加新方法以将click事件绑定到您的TextView:

private void setDatePicker(final TextView textView) {
    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DatePickerFragment newFragment = new DatePickerFragment();

            Bundle b = new Bundle();
            b.putInt("customStyle", R.style.CustomDatePickerDialog);
            newFragment.setArguments(b);

            newFragment.setDatePickerListener(new DatePickerFragment.DatePickerListener() {
                @Override
                public void onDatePicked(String date) {
                    textView.setText(date);
                }
            });

            newFragment.show(getFragmentManager(), "datePicker");
        }
    });
}

最后,在onCreate()方法中,配置应接收所选日期的TextView:

    dataNascText = v.findViewById(R.id.dataNascText);
    setDatePicker(dataNascText);