【问题标题】:Android TimePicker issuesAndroid TimePicker 问题
【发布时间】:2020-04-17 10:31:30
【问题描述】:

在 Android 上,我使用 TimePicker 对话框设置了 EditText。现在是默认时间,但使用 TimePicker 时间会发生变化。

我有三个问题:

1) 选择其他时间,有时EditText上显示的时间不会改变;

2) 如果我在 TimePicker 上提示并选择相同的时间,它会更改 +12h(例如现在是 09.35 但它显示 21.35);

3) 如果我选择一个小时 >= 17.00 我得到一个例外:

07-19 11:47:17.574 16224-16224/com.example.myapp E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        Process: com.example.myapp, PID: 16224
                                                                        java.lang.ArrayIndexOutOfBoundsException: length=17; index=18
                                                                            at java.util.Calendar.set(Calendar.java:1122)
                                                                            at com.example.myapp.activities.MyActivity$9.onTimeSet(MyActivity.java:513)
                                                                            at android.app.TimePickerDialog.onClick(TimePickerDialog.java:133)
                                                                            at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:160)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                            at android.os.Looper.loop(Looper.java:135)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5376)
                                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                                            at java.lang.reflect.Method.invoke(Method.java:372)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)

这是我的 TimePicker 函数:

// TimePicker settings
public void setTimeFields(final EditText editText) {
    // Calendar instance
    final Calendar calendar = Calendar.getInstance();
    // TimePicker definition
    TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            calendar.set(hourOfDay, minute);
            editText.setText(new SimpleDateFormat("HH:mm", Locale.ITALIAN).format(calendar.getTime()));
        }
    }, calendar.get(Calendar.HOUR), calendar.get(Calendar.MINUTE), DateFormat.is24HourFormat(this));
    // Show dialog
    timePickerDialog.show();
}

这里是我的editext定义:

etxTime = (EditText) findViewById(R.id.etxTime);
etxTime.setInputType(InputType.TYPE_NULL);
etxTime.setText(new SimpleDateFormat("HH:mm", Locale.ITALIAN).format(Calendar.getInstance().getTime()));
etxTime.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setTimeFields(etxTime); } });

我哪里错了?

【问题讨论】:

    标签: android dialog datetimepicker timepicker timepickerdialog


    【解决方案1】:
    date.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View arg0) {
    
                // Show Date dialog
                showDialog(Date_id);
            }
        });
        time.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View arg0) {
    
                // Show time dialog
                showDialog(Time_id);
            }
        });
    }
    
    protected Dialog onCreateDialog(int id) {
    
        // Get the calander
        Calendar c = Calendar.getInstance();
    
        // From calander get the year, month, day, hour, minute
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);
    
        switch (id) {
            case Date_id:
    
                // Open the datepicker dialog
                return new DatePickerDialog(MainActivity.this, date_listener, year,
                        month, day);
            case Time_id:
    
                // Open the timepicker dialog
                return new TimePickerDialog(MainActivity.this, time_listener, hour,
                        minute, false);
    
        }
        return null;
    }
    
    // Date picker dialog
    DatePickerDialog.OnDateSetListener date_listener = new DatePickerDialog.OnDateSetListener() {
    
        @Override
        public void onDateSet(DatePicker view, int year, int month, int day) {
            // store the data in one string and set it to text
            String date1 = String.valueOf(month) + "/" + String.valueOf(day)
                    + "/" + String.valueOf(year);
            set_date.setText(date1);
        }
    };
    TimePickerDialog.OnTimeSetListener time_listener = new TimePickerDialog.OnTimeSetListener() {
    
        @Override
        public void onTimeSet(TimePicker view, int hour, int minute) {
            // store the data in one string and set it to text
            String time1 = String.valueOf(hour) + ":" + String.valueOf(minute);
            set_time.setText(time1);
        }
    };
    

    在这种情况下,“date”、“time”是按钮,“set_date”、“set_time”是editTexts。

    【讨论】:

    • 根据您的建议,我更改了 'calendar.set(hourOfDay, minute); editText.setText(new SimpleDateFormat("HH:mm",Locale.ITALIAN).format(calendar.getTime())); ' to 'calendar.set(hourOfDay, minute); editText.setText(String.valueOf(hourOfDay) + ":" + String.valueOf(minute)); ' 这为我解决了 1) 和 2) 的问题,但 3) 仍然存在。所以我删除了'calendar.set(hourOfDay, minute);'这一行它工作正常。谢谢你的建议。无论如何,为什么 'calendar.set(hourOfDay, minute);'创建 java.lang.ArrayIndexOutOfBoundsException ?
    • 我也不知道为什么它会抛出异常。无论如何,如果您认为我的解决方案是正确的,请接受我的回答。
    【解决方案2】:

    出现您描述的第三个问题是因为参数Calendar.set(int, int) 不是小时和分钟,而是field 和要设置的值。如果您查看链接中的表格,您会看到该字段的最大 int 值为 17。因此您的代码应如下所示:

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
        calendar.set(Calendar.MINUTE, minute);
        editText.setText(new SimpleDateFormat("HH:mm", Locale.ITALIAN).format(calendar.getTime()));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      相关资源
      最近更新 更多