You can restrict EditText by using TextWatcher in tricky way.
Working flow for below code
- Create and added TextWatcher to EditText. Did the logic inside onTextChanged function
Logic 1 : To avoid empty space as a first character
Logic 2 : Restrict EditText to allow only one space after a character
Logic 3 : Restrict EditText to allow only one space for entire string
Logic 4 : Remove Text Change Lister before setting value in editText
Logic 5 : Set proper value in editText
Logic 6 : Again add Text Change Lister for editText
Try the below code.
package com.example.application;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
import com.example.myapplication.R;
public class SampleActivity extends AppCompatActivity {
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
editText = findViewById(R.id.editText);
editText.addTextChangedListener(textWatcher);
}
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String preValue = editText.getText().toString();
/*
* To avoid empty space as a first character
* */
if (preValue.length() > 0 && preValue.trim().isEmpty()) {
editText.setText(preValue.substring(0, s.length() - 1));
editText.setSelection(editText.getText().toString().length());
}
/*
* Restrict EditText to allow only one space after a character
* */
if (preValue.endsWith(" ")) {
editText.setText(preValue.substring(0, s.length() - 1));
editText.setSelection(editText.getText().toString().length());
}
/*
* Restrict EditText to allow only one space for entire string
* */
if (preValue.trim().contains(" ") && preValue.endsWith(" ")) {
/*
* Remove Text Change Lister before setting value in editText
* */
editText.removeTextChangedListener(textWatcher);
/*
* Set proper value in editText
* */
editText.setText(preValue.substring(0, s.length() - 1));
editText.setSelection(editText.getText().toString().length());
/*
* Again add Text Change Lister for editText
* */
editText.addTextChangedListener(textWatcher);
}
if (preValue.contains("---") && preValue.endsWith(" ")) {
String[] words = preValue.split(" ");
if (words.length >= 2) {
editText.setText(preValue.substring(0, s.length() - 1));
editText.setSelection(editText.getText().toString().length());
return;
}
StringBuilder stringBuilder = new StringBuilder();
for (String word : words) {
stringBuilder.append(word).append(" ");
}
/*
* Remove Text Change Lister before setting value in editText
* */
editText.removeTextChangedListener(textWatcher);
/*
* Set proper value in editText
* */
editText.setText(stringBuilder);
editText.setSelection(editText.getText().toString().length());
/*
* Again add Text Change Lister for editText
* */
editText.addTextChangedListener(textWatcher);
}
}
@Override
public void afterTextChanged(Editable s) {
}
};
}
I hope this will solve your problem.