如何在Java Android Studio中验证日、月和年,
我有这段代码,但是runValidations没有检查日期、月份和年份是否正确。编译器没有显示任何错误或任何东西。我一遍又一遍地阅读代码,不知道如何修复此验证,我将非常感谢您的帮助 我已经尝试了我能想到的所有可能的事情,但我没有取得任何进展如何在Java Android Studio中验证日、月和年,,java,android,android-studio,date,parsing,Java,Android,Android Studio,Date,Parsing,我有这段代码,但是runValidations没有检查日期、月份和年份是否正确。编译器没有显示任何错误或任何东西。我一遍又一遍地阅读代码,不知道如何修复此验证,我将非常感谢您的帮助 我已经尝试了我能想到的所有可能的事情,但我没有取得任何进展 { ActivityMainBinding binding; boolean isPasswordHidden = true; public static final String USER_EXTRA = "USER
{
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;
}
}
{
活性主键结合;
布尔值isPasswordHidden=true;
公共静态最终字符串USER\u EXTRA=“USER\u EXTRA”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
binding=ActivityMainBinding.flate(getLayoutInflater());
setContentView(binding.getRoot());
binding.button.setOnClickListener(this::runValidations);
binding.ivHidden.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
isPasswordHidden=!isPasswordHidden;
如果(isPasswordHidden){
binding.ivHidden.setImageResource(R.drawable.ic\u基线\u可见性\u关闭\u 24);
binding.etPassword.setTransformationMethod(新的PasswordTransformationMethod());
}否则{
binding.ivHidden.setImageResource(R.drawable.ic_基线_可见性_24);
binding.etPassword.setTransformationMethod(null);
}
binding.etPassword.setSelection(binding.etPassword.getText().length());
}
});
binding.cbTerms.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener()){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
binding.button.setEnabled(已选中);
}
});
}
公共void运行验证(视图){
布尔值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()
&&验证eyear();
如果(isEverythingOk){
Intent Intent=新的Intent(这个,SuccessActivity.class);
用户=新用户(
getTrimmedText(binding.etName),
getTrimmedText(binding.etLastName),
getTrimmedText(binding.etMail),
getTrimmedText(binding.etPassword),
"", ""
);
意图.额外输入(用户额外输入,用户);
星触觉(意向);
完成();
}
}
专用布尔值验证ForemptyField(EditText EditText){
String fieldContent=getTrimmedText(编辑文本);
布尔值isValid=!fieldContent.isEmpty();
如果(!isValid){
setError(getString(R.string.error_empty_field));
}
返回有效;
}
私有字符串getTrimmedText(EditText EditText){
返回editText.getText().toString().trim();
}
私有布尔validateEmailAddressField(){
boolean isValid=Patterns.EMAIL_ADDRESS.matcher(gettrimmetext(binding.etMail)).matches();
如果(!isValid){
binding.etMail.setError(getString(R.string.error\u无效的电子邮件));
}
返回有效;
}
私有布尔validatePasswordLength(){
字符串密码=gettrimmetext(binding.etPassword);
布尔值isValid=password.length()>=10;
如果(!isValid){
binding.etPassword.setError(getString(R.string.error_password_length));
}
返回有效;
}
私有int-parsetpoint(EditText-EditText){
试一试{
字符串内容=getTrimmedText(editText);
返回整数.parseInt(content);
}捕获(数字格式){
返回-1;
}
}
公共布尔validateDay(){
int value=parsetPoint(binding.etDays);
布尔值isValid=(值为0);
如果(!isValid){
binding.etDays.setError(getString(R.string.error\u invalid\u day));
}
返回有效;
}
公共布尔validateMonth(){
int valueM=parsetPoint(binding.etMonths);
布尔值isValid=(valueM>=1&&valueM 1900);
如果(!isValid){
binding.etYears.setError(getString(R.string.error_无效_年));
}
返回有效;
}
}
它运行名称、姓氏、邮件和密码的验证。除了日期之外的所有内容,运行avd我可以在日期上输入任何值,并且当我引入错误值时不会显示错误。您应该使用,但如果您想使用EditText,我建议创建一个日历实例,并尝试将日期、月份和年份设置为该实例。
我不认为
布尔值是有效的=(值为0)代码>是一个很好的日验证选项。并非所有月份都有31天。分别验证年份、月份和日期不仅复杂而且容易出错。我建议您通过组合来自binding.etyear
、binding.etMonths
和binding.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的更多信息
注意:java.utildate-time API及其格式化APISimpleDateFormat
已经过时且容易出错。建议完全停止使用,并切换到
- 不管什么原因,如果你没有