android之如何更改 DatePickerDialog 中 NumberPickers 的顺序
我想交换月份和日期(微调器)。我想将日期列 (Spinner) 发送到左侧,将月份列 (Spinner) 发送到中间。可能吗?
请您参考如下方法:
根据来源中的注释,这些 NumberPicker
的顺序s 由用户选择的系统范围的日期格式确定,取决于给定用户区域设置的最佳顺序的确定。没有可用的公共(public)方法可以轻松更改此设置。但是,无论如何,我已经找到了一种更改顺序的方法。
在以下示例中,我们获取 DatePickerDialog
的 ID。的NumberPicker
s 来自系统资源。我通过检查 the layout file 找到了这些标识符的名称对于DatePicker
类(class)。
获得 ID 后,我们会找到 NumberPicker
s 和他们的 parent LinearLayout
在对话框中,就像我们在任何其他 View
中一样.然后,我们可以从布局中删除微调器,并以所需的任何顺序将它们添加回来。 DatePicker
类使用相同的方法对微调器进行重新排序,下面的一些代码是从其源代码中提取的。
添加回每个微调器后,我们需要调用 setImeOptions()
用它和它的新索引按顺序排列。这将纠正微调器输入的焦点链和键盘反馈 TextView
s。
这一切都变得有点笨拙,所以我用几种方法把它包起来。您只需调用orderDate()
显示对话框后的方法,带有 char
指示所需日期顺序的数组。例如:
DatePickerDialog dialog = new DatePickerDialog(...);
...
dialog.show();
orderDate(dialog, new char[]{'d', 'm', 'y'});
我们保留一个
int
微调器数量的常量,简化了从源代码中提取的一些代码:
private static final int SPINNER_COUNT = 3;
private void orderDate(DatePickerDialog dialog, char[] ymdOrder) {
if(!dialog.isShowing()) {
throw new IllegalStateException("Dialog must be showing");
}
final int idYear = Resources.getSystem().getIdentifier("year", "id", "android");
final int idMonth = Resources.getSystem().getIdentifier("month", "id", "android");
final int idDay = Resources.getSystem().getIdentifier("day", "id", "android");
final int idLayout = Resources.getSystem().getIdentifier("pickers", "id", "android");
final NumberPicker spinnerYear = (NumberPicker) dialog.findViewById(idYear);
final NumberPicker spinnerMonth = (NumberPicker) dialog.findViewById(idMonth);
final NumberPicker spinnerDay = (NumberPicker) dialog.findViewById(idDay);
final LinearLayout layout = (LinearLayout) dialog.findViewById(idLayout);
layout.removeAllViews();
for (int i = 0; i < SPINNER_COUNT; i++) {
switch (ymdOrder[i]) {
case 'y':
layout.addView(spinnerYear);
setImeOptions(spinnerYear, i);
break;
case 'm':
layout.addView(spinnerMonth);
setImeOptions(spinnerMonth, i);
break;
case 'd':
layout.addView(spinnerDay);
setImeOptions(spinnerDay, i);
break;
default:
throw new IllegalArgumentException("Invalid char[] ymdOrder");
}
}
}
private void setImeOptions(NumberPicker spinner, int spinnerIndex) {
final int imeOptions;
if (spinnerIndex < SPINNER_COUNT - 1) {
imeOptions = EditorInfo.IME_ACTION_NEXT;
}
else {
imeOptions = EditorInfo.IME_ACTION_DONE;
}
int idPickerInput = Resources.getSystem().getIdentifier("numberpicker_input", "id", "android");
TextView input = (TextView) spinner.findViewById(idPickerInput);
input.setImeOptions(imeOptions);
}
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。