Links & Dependenciesactivity_main.xmlMainActivity.java
Design Support Library:
developer.android.com/topic/libraries/support-library/packages.html#design
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp" tools:context="com.codinginflow.textinputlayoutexample.MainActivity"> <android.support.design.widget.TextInputLayout android:id="@+id/text_input_email" android:layout_width="match_parent" android:layout_height="wrap_content" app:errorEnabled="true"> <android.support.design.widget.TextInputEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Email" android:inputType="textEmailAddress" /> </android.support.design.widget.TextInputLayout> <android.support.design.widget.TextInputLayout android:id="@+id/text_input_username" android:layout_width="match_parent" android:layout_height="wrap_content" app:counterEnabled="true" app:counterMaxLength="15" app:errorEnabled="true"> <android.support.design.widget.TextInputEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Username" android:inputType="text" /> </android.support.design.widget.TextInputLayout> <android.support.design.widget.TextInputLayout android:id="@+id/text_input_password" android:layout_width="match_parent" android:layout_height="wrap_content" app:errorEnabled="true" app:passwordToggleEnabled="true"> <android.support.design.widget.TextInputEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Password" android:inputType="textPassword" /> </android.support.design.widget.TextInputLayout> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="confirmInput" android:text="Confirm" /> </LinearLayout>
package com.codinginflow.textinputlayoutexample; import android.support.design.widget.TextInputLayout; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Patterns; import android.view.View; import android.widget.Toast; import java.util.regex.Pattern; public class MainActivity extends AppCompatActivity { private static final Pattern PASSWORD_PATTERN = Pattern.compile("^" + //"(?=.*[0-9])" + //at least 1 digit //"(?=.*[a-z])" + //at least 1 lower case letter //"(?=.*[A-Z])" + //at least 1 upper case letter "(?=.*[a-zA-Z])" + //any letter "(?=.*[@#$%^&+=])" + //at least 1 special character "(?=\\S+$)" + //no white spaces ".{4,}" + //at least 4 characters "$"); private TextInputLayout textInputEmail; private TextInputLayout textInputUsername; private TextInputLayout textInputPassword; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textInputEmail = findViewById(R.id.text_input_email); textInputUsername = findViewById(R.id.text_input_username); textInputPassword = findViewById(R.id.text_input_password); } private boolean validateEmail() { String emailInput = textInputEmail.getEditText().getText().toString().trim(); if (emailInput.isEmpty()) { textInputEmail.setError("Field can't be empty"); return false; } else if (!Patterns.EMAIL_ADDRESS.matcher(emailInput).matches()) { textInputEmail.setError("Please enter a valid email address"); return false; } else { textInputEmail.setError(null); return true; } } private boolean validateUsername() { String usernameInput = textInputUsername.getEditText().getText().toString().trim(); if (usernameInput.isEmpty()) { textInputUsername.setError("Field can't be empty"); return false; } else if (usernameInput.length() > 15) { textInputUsername.setError("Username too long"); return false; } else { textInputUsername.setError(null); return true; } } private boolean validatePassword() { String passwordInput = textInputPassword.getEditText().getText().toString().trim(); if (passwordInput.isEmpty()) { textInputPassword.setError("Field can't be empty"); return false; } else if (!PASSWORD_PATTERN.matcher(passwordInput).matches()) { textInputPassword.setError("Password too weak"); return false; } else { textInputPassword.setError(null); return true; } } public void confirmInput(View v) { if (!validateEmail() | !validateUsername() | !validatePassword()) { return; } String input = "Email: " + textInputEmail.getEditText().getText().toString(); input += "\n"; input += "Username: " + textInputUsername.getEditText().getText().toString(); input += "\n"; input += "Password: " + textInputPassword.getEditText().getText().toString(); Toast.makeText(this, input, Toast.LENGTH_SHORT).show(); } }