如何在Java Android Studio中验证日、月和年?



我有这段代码,但是runValidations没有检查日、月和年是否正确。编译器没有显示任何错误。我一遍又一遍地阅读代码,不知道如何修复这个验证,我将非常感谢您的帮助。

我已经试过了所有我能想到的方法,但还是一无所获。

{
ActivityMainBinding binding;
boolean isPasswordHidden = true;
public static final String USER_EXTRA = "USER_EXTRA";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.button.setOnClickListener(this::runValidations);
binding.ivHidden.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
isPasswordHidden = !isPasswordHidden;
if (isPasswordHidden) {
binding.ivHidden.setImageResource(R.drawable.ic_baseline_visibility_off_24);
binding.etPassword.setTransformationMethod(new PasswordTransformationMethod());
} else {
binding.ivHidden.setImageResource(R.drawable.ic_baseline_visibility_24);
binding.etPassword.setTransformationMethod(null);
}
binding.etPassword.setSelection(binding.etPassword.getText().length());
}
});
binding.cbTerms.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
binding.button.setEnabled(isChecked);
}
});
}

public void runValidations(View view) {
boolean isEverythingOk = verifyForEmptyField(binding.etName)
&& verifyForEmptyField(binding.etLastName)
&& verifyForEmptyField(binding.etMail)
&& verifyForEmptyField(binding.etPassword)
&& verifyForEmptyField(binding.etDays)
&& verifyForEmptyField(binding.etMonths)
&& verifyForEmptyField(binding.etYears)
&& validateEmailAddressField()
&& validatePasswordLength()
&& validateDay()
&& validateMonth()
&& validateYear();
if (isEverythingOk) {
Intent intent = new Intent(this, SuccessActivity.class);
User user = new User(
getTrimmedText(binding.etName),
getTrimmedText(binding.etLastName),
getTrimmedText(binding.etMail),
getTrimmedText(binding.etPassword),
"", ""
);
intent.putExtra(USER_EXTRA, user);
startActivity(intent);
finish();
}
}

private boolean verifyForEmptyField(EditText editText) {
String fieldContent = getTrimmedText(editText);
boolean isValid = !fieldContent.isEmpty();
if (!isValid) {
editText.setError(getString(R.string.error_empty_field));
}
return isValid;
}
private String getTrimmedText(EditText editText) {
return editText.getText().toString().trim();
}
private boolean validateEmailAddressField() {
boolean isValid = Patterns.EMAIL_ADDRESS.matcher(getTrimmedText(binding.etMail)).matches();
if (!isValid) {
binding.etMail.setError(getString(R.string.error_invalid_email));
}
return isValid;
}
private boolean validatePasswordLength() {
String password = getTrimmedText(binding.etPassword);
boolean isValid = password.length() >= 10;
if (!isValid) {
binding.etPassword.setError(getString(R.string.error_password_lenght));
}
return isValid;
}
private int parseETtoInt(EditText editText) {
try {
String content =getTrimmedText(editText);
return Integer.parseInt(content);
} catch (NumberFormatException e) {
return -1;
}
}
public boolean validateDay() {
int valueD= parseETtoInt(binding.etDays);
boolean isValid = (valueD <= 31 && valueD > 0);
if (!isValid){
binding.etDays.setError(getString(R.string.error_invalid_day));
}
return isValid;
}
public boolean validateMonth() {
int valueM= parseETtoInt(binding.etMonths);
boolean isValid = (valueM >=1 && valueM <= 12);
if (!isValid){
binding.etMonths.setError(getString(R.string.error_invalid_month));
}
return isValid;
}
public boolean validateYear() {
int valueY= parseETtoInt(binding.etYears);
boolean isValid = (valueY < 2021 && valueY > 1900);
if (!isValid){
binding.etYears.setError(getString(R.string.error_invalid_year));
}
return isValid;
}
}

运行对姓名、姓氏、邮件和密码的验证。除了日期之外的所有内容,运行avd,我可以在日期上输入任何值,当我引入错误的值时不会显示错误。

分别验证年、月和日不仅复杂而且容易出错。我建议您验证完整的日期字符串,该字符串可以通过组合binding.etYears,binding.etMonthsbinding.etDays中的值组成。

演示:

import java.time.DateTimeException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;
import java.util.Locale;
class Main {
// Simulating year, month and day
static String etYears = "2020";
static String etMonths = "2";
static String etDays = "23";
public static void main(String[] args) {
// Tests
System.out.println(isValidDate());
etDays = "30";
System.out.println(isValidDate());
etMonths = "13";
etDays = "23";
System.out.println(isValidDate());
etYears = "1855";
etMonths = "2";
System.out.println(isValidDate());
}
static boolean isValidDate() {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-M-d", Locale.ENGLISH)
.withResolverStyle(ResolverStyle.STRICT);
String strDate = etYears + "-" + etMonths + "-" + etDays;
System.out.println(strDate);
try {
LocalDate date = LocalDate.parse(strDate, dtf);
int year = date.getYear();
return year < 2021 && year > 1900;
} catch (DateTimeException e) {
return false;
}
}
}

输出:

2020-2-23
true
2020-2-30
false
2020-13-23
false
1855-2-23
false

了解更多关于现代日期时间API从Trail: Date Time.

注意:java.util日期时间API及其格式化APISimpleDateFormat过时且容易出错。建议完全停止使用它们并切换到现代日期时间API。

  • 无论什么原因,如果你必须坚持Java 6或Java 7,你可以使用ThreeTen-Backport支持大部分java。time功能到Java 6 &7 .
  • 如果你正在为一个Android项目工作,并且你的Android API级别仍然不符合Java-8,请检查Java 8+ API,通过desugaring和如何在Android项目中使用ThreeTenABP。

你应该使用Datepicker,但如果你想使用EditText,我建议创建一个日历实例,并尝试设置日,月和年。我不认为boolean isValid = (valueD <= 31 && valueD > 0);是一天验证的好选择。不是所有的月份都有31天。

最新更新