AutoCompleteTextView is an EditText which is having features of suggesting what to write next . to show suggestions it uses a drop-down that can be canceled by the back press. Each time, when we use an android application, suppose the user has to write names for multiple places, it will increase the time of the user. For reducing the time and increasing the smoothness of the application user we use AutoCompleteTextView.
What is AutoCompleteTextView.Validator ?
As we discussed above, to validate the suggested text we use AutoCompleteTextView.Validator. A sample video is given below to get an idea about what we are going to do in this article.
Note: This Android article covered in both Java and Kotlin languages.
Step by Step Implementation
Step 1: Create a New Project in Android Studio
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio.
Step 2: Working with the activity_main.xml file
Navigate to app > res > layout > activity_main.xml and add the below code to it. Comments are added in the code to get to know in detail.
<!-- XML code --> <? xml version = "1.0" encoding = "utf-8" ?>
< androidx.constraintlayout.widget.ConstraintLayout
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:background = "@color/white"
tools:context = ".MainActivity" >
< LinearLayout
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:orientation = "vertical" >
< AutoCompleteTextView
android:id = "@+id/autoCompleteTextView"
android:layout_width = "match_parent"
android:layout_height = "100px"
android:textColor = "@android:color/holo_green_light"
android:textSize = "20sp"
android:backgroundTint = "#8C8B8B"
android:textAlignment = "center"
android:layout_gravity = "center"
android:hint = "gfg" />
< EditText
android:id = "@+id/editTextTextPersonName"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:ems = "10"
android:inputType = "textPersonName"
android:textColor = "#5fb300"
android:textAlignment = "center"
android:layout_gravity = "center"
android:text = "focus on me to validate" />
</ LinearLayout >
</ androidx.constraintlayout.widget.ConstraintLayout >
|
Step 3: Working with the MainActivity file
Navigate to app > java > your app’s package name > MainActivity file and add the below code to it. Comments are added in the code to get to know in detail.
package com.example.gfgvalidator;
import static android.widget.Toast.LENGTH_SHORT;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Toast;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Arrays;
public class MainActivity extends AppCompatActivity {
// string values for drop down suggestions
String[] countries={ "India" , "Japan" , "West indies" , "indonesia" , "Indiana" ,
"South Asia" , "Englishtan" , "Srilanka" ,};
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// creating adapters
ArrayAdapter<String> adapter= new ArrayAdapter<String>( this ,android.R.layout.simple_dropdown_item_1line,countries);
// assigning ID's
AutoCompleteTextView textView=(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView);
// setting threshold to 1, so that start
// suggesting by match only first letter
textView.setThreshold( 1 );
textView.setAdapter(adapter);
// using setvalidator
textView.setValidator( new AutoCompleteTextView.Validator() {
@Override
public boolean isValid (CharSequence text){
Log.v( "Test" , "Checking if valid: " + text);
Arrays.sort(countries);
if (Arrays.binarySearch(countries, text.toString())> 0 ) {
Toast.makeText(MainActivity. this , "Correct" , LENGTH_SHORT).show();
return true ;
}
return false ;
}
@Override
public CharSequence fixText (CharSequence invalidText){
// If .isValid() returns false then the code comes here
// do whatever way you want to fix in the
// users input and return it
return "wrong input please correct" ;
}
});
// for changing the background color of title bar
ActionBar aBar = getSupportActionBar();
ColorDrawable cd = new ColorDrawable(Color.parseColor( "#FF00FF00" ));
if (aBar != null ) {
aBar.setBackgroundDrawable(cd);
}
}
// using focus change listener
class FocusListener implements View.OnFocusChangeListener {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (v.getId() == R.id.autoCompleteTextView && !hasFocus) {
((AutoCompleteTextView)v).performValidation();
}
}
}
} |
package com.example.gfgvalidator;
import static android.widget.Toast.LENGTH_SHORT;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Toast;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Arrays;
class MainActivity : AppCompatActivity() {
// string values for drop down suggestions
var countries = arrayOf(
"India" , "Japan" , "West indies" , "indonesia" , "Indiana" ,
"South Asia" , "Englishtan" , "Srilanka"
)
override fun onCreate(savedInstanceState: Bundle?) {
super .onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// creating adapters
val adapter = ArrayAdapter( this , R.layout.simple_dropdown_item_1line, countries)
// assigning ID's
val textView = findViewById<View>(R.id.autoCompleteTextView) as AutoCompleteTextView
// setting threshold to 1 , so that start
// suggesting by match only first letter
textView.threshold = 1
textView.setAdapter(adapter)
// using setvalidator
textView.validator = object : AutoCompleteTextView.Validator {
override fun isValid(text: CharSequence): Boolean {
Log.v( "Test" , "Checking if valid: $text" )
Arrays.sort(countries)
if (Arrays.binarySearch(countries, text.toString()) > 0 ) {
Toast.makeText( this @MainActivity , "Correct" , Toast.LENGTH_SHORT).show()
return true
}
return false
}
override fun fixText(invalidText: CharSequence): CharSequence {
// If .isValid() returns false then the code comes here
// do whatever way you want to fix in
// the users input and return it
return "wrong input please correct"
}
}
// for changing the background
// color of title bar
val aBar = supportActionBar
val cd = ColorDrawable(Color.parseColor( "#FF00FF00" ))
aBar?.setBackgroundDrawable(cd)
}
// using focus change listener
internal class FocusListener : OnFocusChangeListener {
override fun onFocusChange(v: View, hasFocus: Boolean) {
if (v.id == R.id.autoCompleteTextView && !hasFocus) {
(v as AutoCompleteTextView).performValidation()
}
}
}
} |
Output: