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

标签 android

enter image description here

我想交换月份和日期(微调器)。我想将日期列 (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 - 如何更改 DatePickerDialog 中 NumberPickers 的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33624824/

相关文章:

android - 内存友好 : View in xml or java class?

安卓 Facebook 登录 "LoginActivity could not be started"

java - Android:滚动包含recyclerView的 subview 时如何滚动parentView

android - 无法使用 Facebook SDK 针对 Android 2.2 (Froyo) 构建 Android 项目

android - 自动缩放 TextView 文本以适应边界

java - 如何播放Environment.DIRECTORY_DOWNLOADS中的mp3文件

Android - ListView 只显示第一个结果

android - BLE 设备在完美运行数周后停止与 Android 连接

android - android.os.Looper 会耗尽电池电量吗?

java - 即时应用程序 : How to add external libraries?