[英]How can I validate day month and year in Java Android Studio,
I have this code but the runValidations isn't checking if the day month and year are actually correct.我有这段代码,但 runValidations 没有检查日月年是否真的正确。 The compiler isn't showing any errors or whatsoever.
编译器没有显示任何错误或任何错误。 I've read the code over and over and don't see how I can fix this validation, I would appreciate a lot your help.
我一遍又一遍地阅读代码,但不知道如何修复此验证,我将非常感谢您的帮助。
I've tried every possible thing i could think of but i haven't gotten anywhere.我已经尝试了我能想到的所有可能的事情,但我没有得到任何地方。
{
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;
}
}
It runs validations for name, lastname, mail, password.它对姓名、姓氏、邮件、密码进行验证。 Everything except for the date, running the avd I can put in any value on the date and no error shows when I introduce a wrong value.
除了日期之外的所有内容,运行 avd 我可以在日期上输入任何值,并且当我引入错误值时不会显示错误。
Validating the year, month and day separately will be not only complex but also error-prone.分别验证年、月和日不仅复杂而且容易出错。 I recommend you validate the complete date string which you can form by combining the values from
binding.etYears
, binding.etMonths
, and binding.etDays
.我建议您通过组合
binding.etYears
、 binding.etMonths
和binding.etDays
的值来验证完整的日期字符串。
Demo:演示:
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;
}
}
}
Output: Output:
2020-2-23
true
2020-2-30
false
2020-13-23
false
1855-2-23
false
Learn more about the modern date-time API from Trail: Date Time .从Trail: Date Time了解有关现代日期时间 API 的更多信息。
Note: The java.util
date-time API and their formatting API, SimpleDateFormat
are outdated and error-prone.注意:
java.util
日期时间 API 及其格式 API、 SimpleDateFormat
已过时且容易出错。 It is recommended to stop using them completely and switch to the modern date-time API .建议完全停止使用它们并切换到现代日期时间 API 。
You should use Datepicker but if you want to use EditText I suggest to create a Calendar Instance and try to set day, month and year to it.您应该使用Datepicker但如果您想使用 EditText 我建议创建一个日历实例并尝试为其设置日、月和年。 I dont think that
boolean isValid = (valueD <= 31 && valueD > 0);
我不认为
boolean isValid = (valueD <= 31 && valueD > 0);
is a good option for day validation.是一天验证的好选择。 Not all the months have 31 days.
并非所有月份都有 31 天。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.