Различия между TextWatcher onTextChanged, beforeTextChanged и afterTextChanged

в моем проекте Android мне пришлось добавить TextChangedListener (TextWatcher) для редактирования текста. И в нем три части.

  • onTextChanged
  • beforeTextChanged
  • afterTextChanged

каковы различия этих трех. Мне пришлось реализовать поиск таблицы на ключе lisner и для моего случая все эти три выглядят одинаково. И функционировали они одинаково. Когда я ввожу часть названия продукта таблица перерисовывается только с теми продуктами, которые содержат введенный в нее текст. Но я использовал afterTextChanged часть. Мой код

EditProduct.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub

            // System.out.println("onTextChanged"+s);
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub
            // System.out.println("beforeTextChanged"+s);

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            // System.out.println("afterTextChanged"+s);

            String new_prx = s.toString();

            System.out.println(s);
            mini_productList = new ArrayList<Product>();

            // mini_productList
            int count = 0;
            if (new_prx.equals("")) {

                loadtableProducts(productList);

            } else {

                for (int i = 0; i < productList.size(); i++) {

                    if (productList.get(i).getDescription().toString()
                            .substring(0, (new_prx.length()))
                            .equalsIgnoreCase(new_prx)) {
                        mini_productList.add(productList.get(i));
                        count++;

                    }

                }

                loadtableProducts(mini_productList);


            }

        }
    });

так может кто-нибудь дать мне объяснение на этих трех?

5 ответов


onTextChanged в тексте меняется.

afterTextChanged запускается сразу после изменения текста.

beforeTextChanged выполняется за мгновение до изменения текста.

в зависимости от того, когда вы хотите назначить переменные или что-то сделать, вы можете запустить код за мгновение до изменения или мгновение после.

вот пример:

String afterTextChanged = "";
String beforeTextChanged = "";
String onTextChanged = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    et = (EditText)findViewById(R.id.editText);

    et.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int st, int b, int c) 
        {
            onTextChanged = et.getText().toString();
        }

        @Override
        public void beforeTextChanged(CharSequence s, int st, int c, int a) 
        {
            beforeTextChanged = et.getText().toString();
        }

        @Override
        public void afterTextChanged(Editable s) 
        {
            afterTextChanged = et.getText().toString();
            Toast.makeText(Activity.this, "before: " + beforeTextChanged
                                           + '\n' + "on: " + onTextChanged 
                                           + '\n' + "after: " + afterTextChanged
                           ,Toast.LENGTH_SHORT).show();
        }
    });
}

в этом случае предположим, что вы изменили текст с " h " на "hi", вывод было бы:

перед: "h"
на: "привет"
после: "Привет"


Android TextChangedListener - Это один из видов триггера, который вызывается при изменении текста поля ввода.

TextChangedListener есть три события.

1.beforeTextChanged : это означает, что символы будут заменены каким-то новым текстом. Текст не редактируется. Это событие используется, когда вам нужно взглянуть на старый текст, который вот-вот изменится.

2.метода ontextchanged: изменения были сделаны, некоторые символы только что были заместить. Текст не редактируется. Это событие используется, когда необходимо увидеть, какие символы в тексте являются новыми.

3.afterTextChanged : то же самое, что и выше, за исключением того, что теперь текст доступен для редактирования. Это событие используется, когда вам нужно увидеть и, возможно, отредактировать новый текст.


параметры beforeTextChanged и onTextChanged сначала немного трудно понять. Может быть полезно увидеть, как они используются в Примере. Несколько раз посмотрите следующую демонстрацию. Обратите внимание на графы.

  • на красный выделите старый текст, который будет заменен зеленым текстом.
  • на зеленое выделите новый текст, который только что заменил красный текст.

enter image description here

beforeTextChanged

  • start является начальным индексом красного выделенного текста (который будет удален)
  • count длина красный выделенный текст (который будет удален)
  • after длина зеленое выделенный текст (который будет добавлено)

метода ontextchanged

  • start - это начальный индекс зеленого выделенного текста (который только что был добавлен).
    Это то же самое как start of beforeTextChanged.
  • before длина красный выделенный текст (который только что был удален).
    Это то же самое как count of beforeTextChanged.
  • count длина зеленое выделенный текст (который только что получил добавлен.)
    Это то же самое как after of beforeTextChanged.

afterTextChanged

  • editable - редактируемый текст из EditText. Вы можете изменить его здесь. Это вызовет все

  • abstract void afterTextChanged(Editable s)

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

  • abstract void beforeTextChanged(CharSequence s, int start, int count, int after)

этот метод вызывается, чтобы уведомить вас, что в пределах s количество символы, начинающиеся с начала, будут заменены новым текстом с длиной после.

  • abstract void onTextChanged(CharSequence s, int start, int before, int count)

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

вы можете узнать здесь.


  1. afterTextChanged (редактируемые s) - Этот метод вызывается при изменении текста. Потому что любые внесенные изменения приведут этого метод, который будет вызываться снова рекурсивно, вы должны быть осторожны выполнение операций здесь, иначе это может привести к бесконечному циклу.

  2. beforeTextChanged (CharSequence s, int start, int count, int after) - этот метод вызывается, чтобы уведомить вас, что внутри s, граф символы, начинающиеся с начала, будут заменены новым текстом с длиной после. Ошибкой является попытка вносить изменения в с этот обратный вызов.

  3. метода ontextchanged (CharSequence s, int start, int before, int count) - этот метод вызывается, чтобы уведомить вас, что в пределах s количество символы, начинающиеся с start, просто заменили старый текст, который длина перед. Ошибкой является попытка вносить изменения в с этот обратный звонок.