5

我想要一个日期选择器只显示月份和年份。我已经定制了日期选择器来执行此操作,即从选择器中删除“日”字段,但在 Android Lollipop 中,我正在获取带有日、月和年的选择器。以下是我的一段代码。请帮助我了解问题所在。提前致谢。

    try {
        Field f[] = mDatePicker.getClass().getDeclaredFields();
        for (Field field : f) {

            if (field.getName().equals("mDaySpinner") || field.getName().equals("mDayPicker")) {
                field.setAccessible(true);
                Object dayPicker = new Object();
                dayPicker = field.get(mDatePicker);
                ((View) dayPicker).setVisibility(View.GONE);
            }

        }
    } catch (SecurityException e) {
    } catch (IllegalArgumentException e) {
    } catch (IllegalAccessException e) {
    }
4

3 回答 3

10

使用反射来查找和隐藏 UI 元素并不是一个很好的做法。在您的情况下,它停止在棒棒糖中工作,因为mDaySpinner它现在包含在类中的内部私有静态DatePickerSpinngerDelegate类中DatePicker

我建议通过视图层次结构来查找和隐藏日期微调器元素。我编写了以下适用于棒棒糖的代码:

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
    if (daySpinnerId != 0) {
        View daySpinner = datePicker.findViewById(daySpinnerId);
        if (daySpinner != null) {
            daySpinner.setVisibility(View.GONE);
        }
    }
}
于 2015-01-20T19:49:35.753 回答
0

继续制作一个名为 Simple Date Picker 的修改过的 Date Picker ...使用类似于 Date Picker 的代码来显示月份和年份

https://github.com/resengupta/Month-Year-Date-Picker

SimpleDatePickerDialog.java 类负责显示月份和年份的数字选择器。SimpleDatePickerDelegate.java 用于将规则应用于数字选择器。SimpleDatePickerDialogFragment.java 是一个包装警报对话框的 DialogFragment。

于 2015-10-15T10:19:29.593 回答
0

这是月份选择器的基本示例,但也可以轻松适应选择年份和/或日期(也适用于较旧的 android 版本):

public void initMonthPicker(){
dp_mes = (DatePicker) findViewById(R.id.dp_mes);

int year    = dp_mes.getYear();
int month   = dp_mes.getMonth();
int day     = dp_mes.getDayOfMonth();

dp_mes.init(year, month, day, new DatePicker.OnDateChangedListener() {
    @Override
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        month_i = monthOfYear + 1;
        Log.e("selected month:", Integer.toString(month_i));
     //Add whatever you need to handle Date changes
    }
});

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
    int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
    if (daySpinnerId != 0)
    {
        View daySpinner = dp_mes.findViewById(daySpinnerId);
        if (daySpinner != null)
        {
            daySpinner.setVisibility(View.GONE);
        }
    }

    int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
    if (monthSpinnerId != 0)
    {
        View monthSpinner = dp_mes.findViewById(monthSpinnerId);
        if (monthSpinner != null)
        {
            monthSpinner.setVisibility(View.VISIBLE);
        }
    }

    int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
    if (yearSpinnerId != 0)
    {
        View yearSpinner = dp_mes.findViewById(yearSpinnerId);
        if (yearSpinner != null)
        {
            yearSpinner.setVisibility(View.GONE);
        }
    }
} else { //Older SDK versions
    Field f[] = dp_mes.getClass().getDeclaredFields();
    for (Field field : f)
    {
        if(field.getName().equals("mDayPicker") || field.getName().equals("mDaySpinner"))
        {
            field.setAccessible(true);
            Object dayPicker = null;
            try {
                dayPicker = field.get(dp_mes);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            ((View) dayPicker).setVisibility(View.GONE);
        }

        if(field.getName().equals("mMonthPicker") || field.getName().equals("mMonthSpinner"))
        {
            field.setAccessible(true);
            Object monthPicker = null;
            try {
                monthPicker = field.get(dp_mes);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            ((View) monthPicker).setVisibility(View.VISIBLE);
        }

        if(field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner"))
        {
            field.setAccessible(true);
            Object yearPicker = null;
            try {
                yearPicker = field.get(dp_mes);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            ((View) yearPicker).setVisibility(View.GONE);
        }
    }
}

}

于 2015-10-02T07:37:33.923 回答