Android只有日期和月份的日期选择器

8
我正在寻找一种方法来自定义Android中的日期选择器,使之仅显示日和月(即没有年份)。
我正在创建一个基于如何在Android上仅显示月份和年份字段的日期选择器?的对话框。
    Dialog dlg = new DatePickerDialog(context, datePickerListener, dueDateCalendar.get(Calendar.YEAR), dueDateCalendar.get(Calendar.MONTH), dueDateCalendar.get(Calendar.DAY_OF_MONTH));
    try {
        Field f[] = dlg.getClass().getDeclaredFields();
        for (Field field : f) {
            String name = field.getName();
            if (name.equals("YEAR")){
                field.setAccessible(true);
                Object dayPicker = new Object();
                dayPicker = field.get(dlg);
                ((View) dayPicker).setVisibility(View.GONE);
            }
        }
    } catch (Exception e){
        // TODO: should not happen
        e.printStackTrace();
    }
    return dlg;

但是我在 ((View) dayPicker).setVisibility(View.GONE); 上一直收到一个类型转换异常:

java.lang.ClassCastException: java.lang.String cannot be cast to android.view.View

有什么想法吗?

2个回答

20

试试这个。它是APIv11+,但较低API版本有其他方法。

DatePickerDialog dlg = new DatePickerDialog(context, datePickerListener, 
    dueDateCalendar.get(Calendar.YEAR), 
    dueDateCalendar.get(Calendar.MONTH), 
    dueDateCalendar.get(Calendar.DAY_OF_MONTH));
int year = context.getResources().getIdentifier("android:id/year", null, null);
if(year != 0){
    View yearPicker = dlg.getDatePicker().findViewById(year);
    if(yearPicker != null){
        yearPicker.setVisibility(View.GONE);
    }
}
return dlg;

更新后的代码:这应该可以完成任务。

DatePickerDialog dlg = new DatePickerDialog(context, datePickerListener, 
    dueDateCalendar.get(Calendar.YEAR), 
    dueDateCalendar.get(Calendar.MONTH), 
    dueDateCalendar.get(Calendar.DAY_OF_MONTH))
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        int year = getContext().getResources()
            .getIdentifier("android:id/year", null, null);
        if(year != 0){
            View yearPicker = findViewById(year);
            if(yearPicker != null){
                yearPicker.setVisibility(View.GONE);
            }
        }
    }
};
return dlg;

我将 yearPicker 更改为 View yearPicker = dlg.findViewById(year); 以避免 API 级别问题,但它编译通过了却返回 null。有什么想法吗? - checklist
3
它在安卓5.1上无法为我找到年份 :( - Albert Vila Calvo
1
yearPicker 在 API 级别 23 上为 null。 - user2362956
在较新的API级别中,标题中年份TextView的ID为"android:id/date_picker_header_year"。 - Algorithm and Blues

1
这是“对我有效”的解决方案:
DatePickerDialog monthDatePickerDialog = new DatePickerDialog(activity, 
AlertDialog.THEME_HOLO_LIGHT, new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        monthTextView.setText(dayOfMonth+ "/" + (month + 1));
    }
}, yearNow, monthNow, dayNow){
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getDatePicker().findViewById(getResources().getIdentifier("year","id","android")).setVisibility(View.GONE);
    }
};
monthDatePickerDialog.setTitle("select_month");
monthDatePickerDialog.show();

由于制造商在SDK中进行了修改,因此此代码可能无法在某些设备上运行,这也发生在我使用getIdentifier()时。请参见https://stackoverflow.com/questions/42807096/android-findviewbyidresources-getsystem-getidentifierday-id-android - Mihae Kheel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接