我正在使用基本的 DatePicker,我试图弄清楚如何隐藏 DatePickerDialog 上的 Year 字段,以便只有 Month 和 Day 可见。我不介意当年的底层代码仍然存在,我只想在对话框中隐藏年份字段。你知道这样的事情:
((View) myYear).setVisibility(View.GONE);
我知道这是行不通的,因为 myYear 是 int 而不是 View,而是类似的东西。是否可以?
我正在使用基本的 DatePicker,我试图弄清楚如何隐藏 DatePickerDialog 上的 Year 字段,以便只有 Month 和 Day 可见。我不介意当年的底层代码仍然存在,我只想在对话框中隐藏年份字段。你知道这样的事情:
((View) myYear).setVisibility(View.GONE);
我知道这是行不通的,因为 myYear 是 int 而不是 View,而是类似的东西。是否可以?
我发现实现 DatePicker 的一种超级简单的方法是在 xml 中调用它:
<DatePicker
android:id="@+id/thePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
然后在java中隐藏你想要的任何字段(在这种情况下是年份):
picker = (DatePicker) findViewById(R.id.thePicker);
try {
Field f[] = picker.getClass().getDeclaredFields();
for (Field field : f) {
if (field.getName().equals("mYearPicker")) {
field.setAccessible(true);
Object yearPicker = new Object();
yearPicker = field.get(picker);
((View) yearPicker).setVisibility(View.GONE);
}
}
}
catch (SecurityException e) {
Log.d("ERROR", e.getMessage());
}
catch (IllegalArgumentException e) {
Log.d("ERROR", e.getMessage());
}
catch (IllegalAccessException e) {
Log.d("ERROR", e.getMessage());
}
这个解决方案要非常小心。您正在使用反射来访问字段并更改可见性。这不适用于 Android 5.0 !Google 已经更改了 TimePicker 和 DatePicker 的实现,并且这些类不再公开委托的任何字段。
我还不知道 Android 5.0+ 的解决方案。一旦我发现有趣的东西,我会尽快通知你。
作为一个想法,您可以使用 Build.VERSION.SDK_INT 检查 Android 版本,然后尝试使用反射访问 DatePickerSpinnerDelegate 并设置所需的字段。
同样,这不是理想的解决方案,因为 Google 可以一次又一次地随意更改...
在日期选择器中禁用年份字段的简单方法
DatePicker dp = findDatePicker((ViewGroup) dialog.getWindow().getDecorView());
if(dp != null)
{
((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setEnabled(false);
((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setAlpha(0.4f);
}
如果您想删除年份字段,只需将结果视图的可见性设置为 View.GONE,如下所示
dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setVisibility(View.GONE)
private DatePicker findDatePicker(ViewGroup group) {
if (group != null) {
for (int i = 0, j = group.getChildCount(); i < j; i++) {
View child = group.getChildAt(i);
if (child instanceof DatePicker) {
return (DatePicker) child;
} else if (child instanceof ViewGroup) {
DatePicker result = findDatePicker((ViewGroup) child);
if (result != null)
return result;
}
}
}
return null;
}
我参考了以下链接以供参考 从 DatePickerDialog 中删除年份
您可以使用此功能设置年份范围
datePicker.setYearRange(1950,2017);
最近设法通过将日期选择器宽度设置得太小来隐藏对话框的年份部分。
<DatePicker
android:id="@+id/month_day_datepicker"
android:layout_width="140dp"
android:datePickerMode="spinner"
style="?android:attr/borderlessButtonStyle"/>
让我知道这是否有效,显然,绑定中有一个可访问的年份,但在计算日期时你不能选择它。