Android API 21+ DatePicker无法隐藏字段
Android API 21+ DatePicker Can't Hide Fields
我试图在 AlertDialog 的 DatePicker 中仅显示日期和月份字段。在 API 21 之前的 API 中,我可以使用代码 below.But 来完成,而我在 API21+ "getDeclaredFields()" 中尝试这样做却不行甚至 returns 像 "mYearPicker" 或 "mYearSpinner" fields.Does 任何人都知道我怎样才能显示日期和月份字段?我什至不知道字段“116”是什么.
我的代码是这样的:
final DatePicker datePickerStart = new DatePicker(new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light_Dialog_NoActionBar));
datePickerStart .setCalendarViewShown(false);
datePickerStart .setSpinnersShown(true);
try {
Field f[] = datePickerStart .getClass().getDeclaredFields();
for (Field field : f) {
if (field.getName().equals("mYearPicker")|| field.getName().equals("mYearSpinner")) {
field.setAccessible(true);
Object yearPicker = new Object();
yearPicker = field.get(datePickerStart);
((View) yearPicker).setVisibility(View.GONE);
}
}
}
catch (Exception e) {
Log.e("ERROR", e.getMessage());
}
应该看起来像:
Before API 21
看起来像这样:
API 21+
有什么想法吗?
感谢@Morse,我找到了解决方案
public DatePicker initMonthPicker(){
DatePicker dp_mes = new DatePicker(new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light_Dialog_NoActionBar));
int year = dp_mes.getYear();
int month = dp_mes.getMonth();
int day = dp_mes.getDayOfMonth();
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.VISIBLE);
}
}
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);
}
}
}
return dp_mes;
}
所以我只是在需要一个新的 DatePicker 对象时调用这个方法
我试图在 AlertDialog 的 DatePicker 中仅显示日期和月份字段。在 API 21 之前的 API 中,我可以使用代码 below.But 来完成,而我在 API21+ "getDeclaredFields()" 中尝试这样做却不行甚至 returns 像 "mYearPicker" 或 "mYearSpinner" fields.Does 任何人都知道我怎样才能显示日期和月份字段?我什至不知道字段“116”是什么.
我的代码是这样的:
final DatePicker datePickerStart = new DatePicker(new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light_Dialog_NoActionBar));
datePickerStart .setCalendarViewShown(false);
datePickerStart .setSpinnersShown(true);
try {
Field f[] = datePickerStart .getClass().getDeclaredFields();
for (Field field : f) {
if (field.getName().equals("mYearPicker")|| field.getName().equals("mYearSpinner")) {
field.setAccessible(true);
Object yearPicker = new Object();
yearPicker = field.get(datePickerStart);
((View) yearPicker).setVisibility(View.GONE);
}
}
}
catch (Exception e) {
Log.e("ERROR", e.getMessage());
}
应该看起来像: Before API 21
看起来像这样: API 21+
有什么想法吗?
感谢@Morse,我找到了解决方案
public DatePicker initMonthPicker(){
DatePicker dp_mes = new DatePicker(new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light_Dialog_NoActionBar));
int year = dp_mes.getYear();
int month = dp_mes.getMonth();
int day = dp_mes.getDayOfMonth();
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.VISIBLE);
}
}
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);
}
}
}
return dp_mes;
}
所以我只是在需要一个新的 DatePicker 对象时调用这个方法