Как сделать буквы заглавными в editText? - PullRequest
0 голосов

У меня есть простой Edittext, и когда я собираюсь изменить вводимые буквы в настройке прослушивателя IM new textWatcher, и это onTextChanged() метод, подобный:

@Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            Log.d("qwer", "onTextChanged: " + s + " " + start + " " + before + " " + count);

            String originalText = s.toString();
            int originalTextLength = originalText.length();
            int currentSelection = textHeading.getSelectionStart();

            StringBuilder sb = new StringBuilder();
            boolean hasChanged = false;
            for (int i = 0; i < originalTextLength; i++) {
                char currentChar = originalText.charAt(i);
                if (isAllowed(currentChar) && i < 21) {
                    sb.append(currentChar);
                } else {
                    hasChanged = true;
                    textHeading.setError("Please insert current letters");
                }
            }
            if (hasChanged) {
                String newText = sb.toString();
                textHeading.setText(capitalize(newText));
                textHeading.setSelection(currentSelection);
            }
        }

бесконечный цикл начинается, когда я возвращаю проверенные данные обратно в текст редактирования, потому что он снова вызывает метод ontextCahnged(). поэтому моя цель - динамически изменять вводимые буквы, и я должен использовать их с большой буквы. Я знаю, что есть более простой способ сделать это. но мне нужно сделать таким образом.

Ответы [ 7 ]

0 голосов
/ 05 июля 2018

Вы можете просто использовать в XML

android:inputType="textCapCharacters"

не нужно писать код для прописной буквы.

0 голосов
/ 05 июля 2018

Попробуй так:

  String originalText = s.toString().toUpperCase();

или

if (hasChanged) {
            String newText = sb.toString().toUpperCase();
            textHeading.setText(newText);
            textHeading.setSelection(currentSelection);
        }
0 голосов
/ 05 июля 2018

У вас проблема с TextWatcher, а не с логикой, которую вы пишете. Блок кода ниже вызывает проблему (endless cycle begins when i'm setting validated data back to the edittext becouse it calls method ontextCahnged() again)

if (hasChanged) {
    String newText = sb.toString();
    textHeading.setText(capitalize(newText)); // <<<<<< This line is culprit which is calling Watcher's method again and again.
    textHeading.setSelection(currentSelection);
}

Чтобы решить эту проблему, вам нужно выполнить следующие шаги

  1. Удалить Watcher из EditText
  2. Установить текст
  3. Добавление наблюдателя в EditText.

Для получения дополнительной информации прочитайте Как я могу изменить текст EditText без запуска Text Watcher?

0 голосов
/ 05 июля 2018

Почему бы не использовать флаг? Я изменил ваш код, добавив флаг boolean setManually.

boolean setManually = false;
@Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            Log.d("qwer", "onTextChanged: " + s + " " + start + " " + before + " " + count);
            if (setManually) {
                 setManually = false;
                  return;
            }

            String originalText = s.toString();
            int originalTextLength = originalText.length();
            int currentSelection = textHeading.getSelectionStart();

            StringBuilder sb = new StringBuilder();
            boolean hasChanged = false;
            for (int i = 0; i < originalTextLength; i++) {
                char currentChar = originalText.charAt(i);
                if (isAllowed(currentChar) && i < 21) {
                    sb.append(currentChar);
                } else {
                    hasChanged = true;
                    textHeading.setError("Please insert current letters");
                }
            }
            if (hasChanged) {
                String newText = sb.toString();
                 setManually = true;
                textHeading.setText(capitalize(newText));
                textHeading.setSelection(currentSelection);
            }
        }
0 голосов
/ 05 июля 2018

Вы можете использовать следующие InputFilter.AllCaps

или это

android:inputType="textCapCharacters"
0 голосов
/ 05 июля 2018

Вы можете установить тип ввода (из EditText) в TYPE_CLASS_TEXT | TYPE_TEXT_FLAG_CAP_CHARACTERS.

OR

Установите android: inputType = "textCapSentences" в вашем EditText.

Вы можете перейти по этой ссылке https://developer.android.com/reference/android/text/InputFilter.AllCaps

0 голосов
/ 05 июля 2018

Есть много способов сделать это:

1- Использование общих утилит

Библиотека: http://commons.apache.org/proper/commons-lang/

StringUtils.capitalize(..)

2 - Пользовательским методом

public static String upperCaseFirst(String value) {

        // Convert String to char array.
        char[] array = value.toCharArray();
        // Modify first element in array.
        array[0] = Character.toUpperCase(array[0]);
        // Return string.
        return new String(array);
    }

3 - от Apache Common

Библиотека: http://commons.apache.org/proper/commons-lang/

WordUtils.capitalize(java.lang.String)

Теперь вы можете назначить эту строку для вашего поля ввода.

...