AlertDialog textinput 设置计时器的时间。格式必须是 00:00:00 但用户仍然可以输入任何数字,这会导致错误。如何限制输入?

AlertDialog textinput sets time for timer. Format must be 00:00:00 but user can still put any number, which causes error. How do I limit the input?

辛苦的小伙伴们大家好!

我的应用程序中有一个计时器,运行良好。 当时的用户输入来自警报对话框:

private void showChangeTimerDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("Change Timer");

        final EditText timeInput = new EditText(MainActivity.this);
        timeInput.setInputType(InputType.TYPE_CLASS_DATETIME);
        timeInput.setHint("Must be in 00:00:00 format");
        builder.setView(timeInput);
        builder.setPositiveButton("Submit", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                TimePreference timePreference = new TimePreference(MainActivity.this);
                timePreference.setTime(timeInput.getText().toString());

                String newTimer = timePreference.getTime();
                timerText.setText(newTimer);
            }
        });
        builder.show();

    }

为了让计时器工作,用户必须完全按照 00:00:00 格式输入,应用程序才能工作,例如 00:10:00 10 分钟。

目前,用户仍然可以输入一个随机数,例如 10,这将作为 10 输入到计时器的 TextView 中,当用户按下计时器的“开始”按钮时,应用程序崩溃并显示 "java.lang.ArrayIndexOutOfBoundsException: length=1; index=2".

我的问题是: 如何将警告对话框中的用户输入严格限制为 00:00:00 格式,以便在例如用户输入 10 时显示为 10:00:00 或 00:00:10.

感谢您的帮助!

如果您需要我的代码的任何其他部分,请告诉我。

供参考,下面是我的计时器代码(开始按钮部分):

startTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String strInput = timerText.getText().toString();

                startTime.setEnabled(false);
                toggleBtn.setEnabled(true);
                resetTime.setEnabled(true);

                isPaused = false;
                isCanceled = false;


                String[] tokens = strInput.split(":");
                int secondsToMs = Integer.parseInt(tokens[2]) * 1000;
                int minutesToMs = Integer.parseInt(tokens[1]) * 60000;
                int hoursToMs = Integer.parseInt(tokens[0]) * 3600000;
                final long millisInFuture = secondsToMs + minutesToMs + hoursToMs;
                long countDownInterval = 1000;


                new CountDownTimer(millisInFuture, countDownInterval) {
                    @Override
                    public void onTick(long millisUntilFinished) {
                        if (isCanceled || isPaused) {
                            cancel();
                        } else {
                            long millis = millisUntilFinished;
                            final String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
                                    TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
                                    TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
                            timerText.setText(hms);
                            remainingTime = millisUntilFinished;
                        }
                    }

                    @Override
                    public void onFinish() {

                        timerText.setText("00:00:00");

                    }
                }.start();
            }
        });

您可以使用 addTextChangedListener 并在 onTextChanged 中在用户输入的每两个字符后添加“:”。 或者放三个 Texview 而不是一个并将每个字符中的字符数限制为两个。最后,将所有三个字符串组合成一个你想要的格式

好奇一下,为什么不使用 timePicker?