2016-11-18 2 views
-2

Я сделал код, в котором пользователь не может ввести первое место в строке. Пользователь может ввести пробел после мин. 2 символов. Мне нужно переопределить мой метод, чтобы пользователь вводил пробел один раз и только один раз после двух или более символов. После этого его следует предотвратить. Как мне это сделать?Предотвращение пробелов в строке после одного ввода

case UPDATE_NAME: 
 
\t  if (firstName.getText().toString().startsWith(" ")) 
 
\t \t firstName.setText(firstName.getText().toString().trim()); 
 

 
\t  if (firstName.getText().toString().contains(" ")) 
 
\t \t firstName.setText(firstName.getText().toString().replace(" ", " ")); 
 

 
\t  int indexOfSpace = firstName.getText().toString().lastIndexOf(" "); 
 
\t  if (indexOfSpace > 0) { 
 
\t \t String beforeSpace = firstName.getText().toString().substring(0, indexOfSpace); 
 
\t \t String[] splitted = beforeSpace.split(" "); 
 
\t \t if (splitted != null && splitted.length > 0) { 
 
\t \t  if (splitted[splitted.length - 1].length() < 2) 
 
\t \t \t firstName.setText(firstName.getText().toString().trim()); 
 
\t \t } 
 
\t  }

ответ

1

Используйте регулярное выражение pattern. I made one, который должен соответствовать вашим требованиям.

\S{2}\S*\s\S*\n 

Explanation: 
\S{2} two non whitespace 
\S* n non whitespace 
\s a whitespace 
\S* n non whitespace 
\n newline (i only added that for regexr, you may not need it) 

Альтернативный способ: перебрать String.charAt(int), возвращение ложным, если есть пробелы в первых двух символов, посчитайте все непечатаемые, возвращают ложь, если п> 1.

+0

как добавить алфавит в этой модели –

+0

\ S является Defacto алфавит/цифры/и т.д.. Он содержит все символы, за исключением пробелов, – GoneUp

0

Что вам нужно сделать, это использовать TextWatcher

public class CustomWatcher implements TextWatcher { 

private String myText; 
private int count = 0; 

@Override 
public void beforeTextChanged(CharSequence s, int start, int count, int after){ 
    myText= s; 
} 

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 

} 

@Override 
public void afterTextChanged(Editable s) { 
    //check if there is a space in the first 2 characters, if so, sets the string to the previous before the space 
    if(s.length() < 3 && s.contains(" ")) 
     s= myText; 

    //if the length is higher than 2, and the count is higher than 0 (1 space added already), puts the string back if a space is entered 
    else if(s.contains(" ") && count > 0) 
     s= myText; 

    //If none of the above is verified and you enter a space, increase count so the previous if statement can do its job 
    else if(s.contains(" ")) 
     count++; 

} 

}

А затем установите его в EditText

mTargetEditText.addTextChangedListener(new CustomWatcher()); 
0

Вы можете контролировать свой EditText (я предполагаю) с TextWatcher, вам нужно будет только проверить внутри afterTextChanged(), если длина < 2 и еще, если строка содержит символ «».

1

Этот метод должен соответствовать вашим требованиям:

private static boolean isValidFirstName(String firstName) { 
    if (firstName != null && !firstName.startsWith(" ")) { 
     int numberOfSpaces = firstName.length() - firstName.replace(" ", "").length(); 
     if (firstName.length() < 2 || numberOfSpaces <= 1) { 
      return true; 
     } 
    } 
    return false; 
} 
Смежные вопросы