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?
辛苦的小伙伴们大家好!
我的应用程序中有一个计时器,运行良好。 当时的用户输入来自警报对话框:
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?