android之如何更改 DatePickerDialog 中 NumberPickers 的顺序

zhujiabin 阅读:65 2024-10-25 08:56:14 评论:0



我想交换月份和日期(微调器)。我想将日期列 (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); 
} 


标签:Android
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号