在Android 5.0+中,从DatePicker中隐藏日期、月份或年份;棒棒糖
我一直在寻找一个解决方案,以隐藏以下任何一个微调器的日期选择器。对于Android 5.0,内部变量发生了变化,在我的情况下,在我的设备更新后,日期和月份微调器再次可见 Android 4.4和Kitkat解决方案在Android 5.0+中,从DatePicker中隐藏日期、月份或年份;棒棒糖,android,datepicker,Android,Datepicker,我一直在寻找一个解决方案,以隐藏以下任何一个微调器的日期选择器。对于Android 5.0,内部变量发生了变化,在我的情况下,在我的设备更新后,日期和月份微调器再次可见 Android 4.4和Kitkat解决方案 DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate); // Initialize Date Picker int year = dpDate.getYear(); int month
DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);
// Initialize Date Picker
int year = dpDate.getYear();
int month = dpDate.getMonth();
int day = dpDate.getDayOfMonth();
dpDate.init(year, month, day, this);
Field f[] = dpDate.getClass().getDeclaredFields();
for (Field field : f)
{
// Hides the DAY spinner
if(field.getName().equals("mDayPicker") || field.getName().equals("mDaySpinner"))
{
field.setAccessible(true);
Object dayPicker = new Object();
dayPicker = field.get(dpDate);
((View) dayPicker).setVisibility(View.GONE);
}
// Hides the MONTH spinner
if(field.getName().equals("mMonthPicker") || field.getName().equals("mMonthSpinner"))
{
field.setAccessible(true);
Object monthPicker = new Object();
monthPicker = field.get(dpDate);
((View) monthPicker).setVisibility(View.GONE);
}
// Hides the YEAR spinner
if(field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner"))
{
field.setAccessible(true);
Object yearPicker = new Object();
yearPicker = field.get(dpDate);
((View) myearPicker).setVisibility(View.GONE);
}
}
DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);
// Initialize Date Picker
int year = dpDate.getYear();
int month = dpDate.getMonth();
int day = dpDate.getDayOfMonth();
dpDate.init(year, month, day, this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
if (daySpinnerId != 0)
{
View daySpinner = dpDate.findViewById(daySpinnerId);
if (daySpinner != null)
{
daySpinner.setVisibility(View.GONE);
}
}
}
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
if (monthSpinnerId != 0)
{
View monthSpinner = dpDate.findViewById(monthSpinnerId);
if (monthSpinner != null)
{
monthSpinner.setVisibility(View.GONE);
}
}
}
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
if (yearSpinnerId != 0)
{
View yearSpinner = dpDate.findViewById(yearSpinnerId);
if (yearSpinner != null)
{
yearSpinner.setVisibility(View.GONE);
}
}
}
Android 5.0+棒棒糖解决方案
DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);
// Initialize Date Picker
int year = dpDate.getYear();
int month = dpDate.getMonth();
int day = dpDate.getDayOfMonth();
dpDate.init(year, month, day, this);
Field f[] = dpDate.getClass().getDeclaredFields();
for (Field field : f)
{
// Hides the DAY spinner
if(field.getName().equals("mDayPicker") || field.getName().equals("mDaySpinner"))
{
field.setAccessible(true);
Object dayPicker = new Object();
dayPicker = field.get(dpDate);
((View) dayPicker).setVisibility(View.GONE);
}
// Hides the MONTH spinner
if(field.getName().equals("mMonthPicker") || field.getName().equals("mMonthSpinner"))
{
field.setAccessible(true);
Object monthPicker = new Object();
monthPicker = field.get(dpDate);
((View) monthPicker).setVisibility(View.GONE);
}
// Hides the YEAR spinner
if(field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner"))
{
field.setAccessible(true);
Object yearPicker = new Object();
yearPicker = field.get(dpDate);
((View) myearPicker).setVisibility(View.GONE);
}
}
DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);
// Initialize Date Picker
int year = dpDate.getYear();
int month = dpDate.getMonth();
int day = dpDate.getDayOfMonth();
dpDate.init(year, month, day, this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
if (daySpinnerId != 0)
{
View daySpinner = dpDate.findViewById(daySpinnerId);
if (daySpinner != null)
{
daySpinner.setVisibility(View.GONE);
}
}
}
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
if (monthSpinnerId != 0)
{
View monthSpinner = dpDate.findViewById(monthSpinnerId);
if (monthSpinner != null)
{
monthSpinner.setVisibility(View.GONE);
}
}
}
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
if (yearSpinnerId != 0)
{
View yearSpinner = dpDate.findViewById(yearSpinnerId);
if (yearSpinner != null)
{
yearSpinner.setVisibility(View.GONE);
}
}
}
我在这里找到了这个问题的上述解决方案:
我想确保它易于搜索,以便其他人可以从中受益,所以我创建了这个新帖子。(这个解决方案花了我几个小时来定位和理解,所以我希望能在这方面帮助别人)
我已经测试过了,效果非常好。事实上,如果你先把棒棒糖的解决方案放在下面,然后在代码中,把Kitkat的解决方案放在下面,那么它对两个版本都是兼容的,没有干扰。(确保使用try/catch;)
编辑7.22.2015:
我认为很明显,如果使用的是日期选择器,则需要对其进行初始化。我包含的代码表明,在运行其余代码(在这两种情况下)之前,需要初始化DatePicker,否则视图将抛出NullPointerException。这包括抛出空值的yearSpinner。此外,您应该至少有一个日期视图,不要隐藏所有3个视图,即不要同时隐藏日期、月份和年份。仅针对懒人,这是一个完全集成的代码(任何SDK),用于我构建一个月选择器(90%等于@Brandon suggestion):
非常简单,但不直观 首先从
DialogPicker
new DatePickerDialog(getActivity(),android.R.style.Theme_Holo_Dialog, this, year,month, day);
现在,是的,您可以隐藏任何微调器
dialog.getDatePicker().findViewById(getResources().getIdentifier("day","id","android")).setVisibility(View.GONE);
在5.0.2API21中对我来说可以正常工作,它对5和6+有不同的id。我已经处理了以下代码
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int yearSpinnerId = Resources.getSystem().getIdentifier("date_picker_year", "id", "android");
if (yearSpinnerId != 0)
{
View yearSpinner = datePicker.findViewById(yearSpinnerId);
if (yearSpinner != null)
yearSpinner.setVisibility(View.GONE);
}
}
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
int yearSpinnerId = Resources.getSystem().getIdentifier("date_picker_header_year", "id", "android");
if (yearSpinnerId != 0)
{
View yearSpinner = datePicker.findViewById(yearSpinnerId);
if (yearSpinner != null)
yearSpinner.setVisibility(View.GONE);
}
}
在这段代码中,“视图”总是空的。你必须更具体地说明你在说什么…我已经使用了上面的代码,我得到的“yearSpinner”是空的。问题应该是什么?我已经对上面的代码进行了编辑,以解释为什么你们都得到了NullPointerException。确保在试图隐藏视图之前初始化DatePicker,否则它将不知道该做什么。看看上面的编辑。我还要说,您需要在onCreate(对于活动)或onCreateView(对于片段)或onCreateDialog(对于DialogFragment)中声明DatePicker。在声明后,在一个单独的方法中初始化它。尝试了无数次这就是解决它的方法!