在Lollipop之后,DatePicker有一个非常漂亮的日历视图来选择日期。但问题是选择年份。大多数普通人在选择年份时遇到麻烦。他们只是滚动。滚动更改年份需要很长时间。所以我需要首先在android中打开Datepicker Dialog时显示年份选择。
Datepicker通常会像下面一样打开:
但它应该从年份选择开始。如下所示:
答案 0 :(得分:20)
您可以获得对年视图的引用,然后只需模拟用户点击即可打开它。
myText.text = "level2"
更新: 如果不清楚我将解释每一步。您需要先拥有datePicker引用。使用datePicker引用,您可以使用getTouchables()方法获取datePicker组件。 组件年份位于第一位,因此需要调用.get(0)来获取对年份的引用。 之后只需模拟用户点击即可在开始时打开多年视图,而不是等待用户点击它。
答案 1 :(得分:3)
没有非常可靠的方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DatePicker datePicker = (DatePicker) findViewById(R.id.test);
openYearView(datePicker);
}
private void openYearView(DatePicker datePicker) {
try {
Field mDelegateField = datePicker.getClass().getDeclaredField("mDelegate");
mDelegateField.setAccessible(true);
Object delegate = mDelegateField.get(datePicker);
Method setCurrentViewMethod = delegate.getClass().getDeclaredMethod("setCurrentView", int.class);
setCurrentViewMethod.setAccessible(true);
setCurrentViewMethod.invoke(delegate, 1);
} catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
}
}
答案 2 :(得分:3)
扩展@MatejVukosav答案
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
LogUtil.LogToConsole(TAG, "Date picker select");
datePickerDialog.getDatePicker().getTouchables().get(1).performClick();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
LogUtil.LogToConsole(TAG, "Date picker select post lollipop");
datePickerDialog.getDatePicker().getTouchables().get(0).performClick();
}
然后显示对话框。
答案 3 :(得分:0)
扩展@GiovannyPiñeros的答案我想建议遍历所有可触摸对象并通过id选择相应的对象,以确保将选择正确的视图。
int viewId = 0;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
viewId = Resources.getSystem().getIdentifier("date_picker_year", "id", "android");
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
viewId = Resources.getSystem().getIdentifier("date_picker_header_year", "id", "android");
}
然后,如果(viewId> 0),我们可以迭代datePickerDialog.getDatePicker()。getTouchables()并将其ID与viewId进行比较。
答案 4 :(得分:0)
kotlin用户根据此线程上已有的答案以供将来参考。
var viewId = 0
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
viewId = Resources.getSystem().getIdentifier("date_picker_year", "id", "android")
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
viewId = Resources.getSystem().getIdentifier("date_picker_header_year", "id", "android")
}
yourDatePickerDialog.show()
for (touchable in yourDatePickerDialog.getDatePicker().getTouchables()) {
if (touchable.id.equals(viewId))
{
touchable.performClick()
break
}
}
答案 5 :(得分:0)
答案 6 :(得分:0)
您可以通过在对话框之前仅添加一行来实现。show()
editext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
calendar=Calendar.getInstance();
int day=calendar.get(Calendar.DAY_OF_MONTH);
int month=calendar.get(Calendar.MONTH);
int year=calendar.get(Calendar.YEAR);
calendar.add(Calendar.DAY_OF_YEAR, 1);
datePickerDialog=new DatePickerDialog(ActivityDoctorDetails.this, R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int m_year, int m_month, int m_day) {
String Mday, Mmonth, Myear;
Mday=Integer.toString(m_day);
Mmonth=Integer.toString(m_month);
if (m_day < 10) {
// editTextDate.setText("0"+m_day+"/"+m_month+"/"+m_year);
Mday="0" + Integer.toString(m_day);
}
if (m_month < 10) {
//editTextDate.setText(m_day+"/"+"0"+m_month+"/"+m_year);
Mmonth="0" + Integer.toString(m_month);
}
if (m_day < 10 && m_month < 10) {
//editTextDate.setText("0" + m_day + "/" + "0" + m_month + "/" + m_year);
Mday="0" + Integer.toString(m_day);
Mmonth="0" + Integer.toString(m_month);
}
if (m_day > 10 && m_month < 10) {
//editTextDate.setText(m_day+"/"+"0"+m_month+"/"+m_year);
Mmonth="0" + Integer.toString(m_month);
Mday=Integer.toString(m_day);
}
if (m_day < 10 && m_month > 10) {
//editTextDate.setText(m_day+"/"+"0"+m_month+"/"+m_year);
Mday="0" + Integer.toString(m_day);
Mmonth=Integer.toString(m_month);
}
editext.setText(m_year + "/" + Mmonth + "/" + Mday);
}
}, day, month, year);
//datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
datePickerDialog.getDatePicker().getTouchables().get(0).performClick();
datePickerDialog.show();
}