使用默认显示,DatePicker显示当前月份,但用户可能希望选择之前数百个月的日期。当然可以点击年份并选择出生年份,但许多用户并未意识到这一点,并且大多数用户都会点击几个月来选择出生日期。这引起了很大的挫折。
有没有办法配置Android DatePicker,以便在打开时要求用户先选择年份?或者有没有办法显示月份,以便用户可以更快地浏览它们而不是点击?或者是否真的有必要在日期选择器之前创建一个UI,要求他们选择DatePicker打开前的年份?我发现DatePicker用于选择日期前一段时间非常差,因为它的易用性需要使用许多用户都不知道的功能。
答案 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搞砸了:
答案 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);