【问题标题】:How to configure DatePicker for date of birth date selection如何为出生日期选择配置 DatePicker
【发布时间】:2017-10-18 13:49:50
【问题描述】:

DatePicker 默认显示当前月份,但用户可能希望选择数百个月前的日期。当然可以点击年份并以这种方式选择出生年份,但许多用户并没有意识到这一点,大多数用户都在点击月份以返回年份来选择出生日期。这引起了很大的挫败感。

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

【问题讨论】:

    标签: android android-datepicker


    【解决方案1】:

    下面 DatePicker 的最后三个属性起到了作用,因为它将 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"
        >
    

    【讨论】:

    • 不知道为什么这被否决了。它对我来说很好。在模拟器、Pixel 和 S6 上测试
    【解决方案2】:

    我只能找到这个库作为一个合适的解决方案,很遗憾谷歌把这个搞砸了:

    https://github.com/drawers/SpinnerDatePicker

    【讨论】:

      【解决方案3】:

      这是你可以做的:

      样式.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>
      

      定义一个新类,它代表一个 DialogFragment,您的 DatePicker 将在其中显示:

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

      在您的活动或片段中,添加一个新方法以将点击事件绑定到您的 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-24
        • 1970-01-01
        • 2015-09-09
        • 1970-01-01
        相关资源
        最近更新 更多