Как проверить текст с большим количеством пустых мест? - PullRequest
0 голосов
/ 28 февраля 2020

Описание:

Я создаю приложение, в котором вы можете изменить имя своего профиля. Проблема в том, что пользователи могут писать свои имена с большим количеством пустых мест, и я не знаю, как избежать этой проблемы.

Пример:

(Я собираюсь представить пустые места с подчеркиванием "_")

Измените ваше имя: T_____omas_Men________n____i_ti //// (31 символ)

Если кто-то напишет это в тексте редактирования, пустые места будут сохранены, и тогда мы увидим это большое имя в профиле пользователя.

Что мне делать хотите?

Мне нужен код, способный проверить, когда текст редактирования содержит более одного (> 1 ) пустых мест в строке, чтобы удалить их. Код должен быть в состоянии обнаружить, что "имя" должно иметь один пустой пробел после "фамилия"

Ответы [ 3 ]

2 голосов
/ 28 февраля 2020

Используйте TextWatcher, как описано здесь: Android: Как я могу проверить ввод EditText?

Затем в методе onTextChanged (CharSequence s, int start, int before, int count) вы может подтвердить ввод пользователя, вот пример:

if (s.contains("  ")) {
    // ask user to edit input
    // or change text programatically
    String after = before.trim().replaceAll(" +", " ");
    // set new text
}
1 голос
/ 28 февраля 2020

Вы можете ограничить EditText, используя хитрый способ TextWatcher.

Рабочий процесс для кода ниже

  • Создание и добавление TextWatcher в EditText. Сделали ли логи c внутри функции onTextChanged

Logi c 1: Чтобы избежать пустого места в качестве первого символа

Logi c 2: Ограничить EditText разрешением только одного пробела после символа

Logi c 3: Ограничить EditText разрешением только одного пробела для всей строки

Logi c 4: Удалить список изменений текста перед установкой значения в editText

Logi c 5: Установить правильное значение в editText

Logi c 6: Снова добавьте Text Change Lister для editText

Попробуйте следующий код.

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) {

        }
    };
}

Надеюсь, это решит вашу проблему.

0 голосов
/ 28 февраля 2020

Я предлагаю другой вид решения, которое фокусируется на работе с голыми строками вместо EditText. Имейте в виду, что этот ответ работает в сочетании с другими ответами здесь.

private static String filterMultipleSpaces(String s) {
    char[] result = new char[s.length()];
    int iC = 0;

    for (int iS = 0; iS < s.length(); ++iS) {
        char currentChar = s.charAt(iS);
        if (currentChar != ' ' || (iC > 0 && result[iC - 1] != ' ')) {
            result[iC] = currentChar;
            ++iC;
        }
    }

    return new String(result);
}

Вышеуказанная функция stati c принимает строку и удаляет несколько пробелов. В идеале вы должны использовать это при изменении текста ( см. Ответ @ Divakar ) или при отправке значения EditText, если вы wi sh

...