Различия между 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
сначала немного трудно понять. Может быть полезно увидеть, как они используются в Примере. Несколько раз посмотрите следующую демонстрацию. Обратите внимание на графы.
- на красный выделите старый текст, который будет заменен зеленым текстом.
- на зеленое выделите новый текст, который только что заменил красный текст.
beforeTextChanged
-
start
является начальным индексом красного выделенного текста (который будет удален) -
count
длина красный выделенный текст (который будет удален) -
after
длина зеленое выделенный текст (который будет добавлено)
метода ontextchanged
-
start
- это начальный индекс зеленого выделенного текста (который только что был добавлен).
Это то же самое какstart
ofbeforeTextChanged
. -
before
длина красный выделенный текст (который только что был удален).
Это то же самое какcount
ofbeforeTextChanged
. -
count
длина зеленое выделенный текст (который только что получил добавлен.)
Это то же самое какafter
ofbeforeTextChanged
.
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, просто заменили старый текст, который длина перед.
вы можете узнать здесь.
afterTextChanged (редактируемые s) - Этот метод вызывается при изменении текста. Потому что любые внесенные изменения приведут этого метод, который будет вызываться снова рекурсивно, вы должны быть осторожны выполнение операций здесь, иначе это может привести к бесконечному циклу.
beforeTextChanged (CharSequence s, int start, int count, int after) - этот метод вызывается, чтобы уведомить вас, что внутри s, граф символы, начинающиеся с начала, будут заменены новым текстом с длиной после. Ошибкой является попытка вносить изменения в с этот обратный вызов.
метода ontextchanged (CharSequence s, int start, int before, int count) - этот метод вызывается, чтобы уведомить вас, что в пределах s количество символы, начинающиеся с start, просто заменили старый текст, который длина перед. Ошибкой является попытка вносить изменения в с этот обратный звонок.