2013-11-29 2 views
21

В моем проекте Android мне пришлось добавить TextChangedListener (TextWatcher) в текстовое представление редактирования. И есть три части.Различия между TextWatcher's onTextChanged, beforeTextChanged и afterTextChanged

  • onTextChanged
  • beforeTextChanged
  • afterTextChanged

Что дифферент этих трех. Мне пришлось выполнить поиск таблицы на ключевом лизере, и для моего случая все эти три выглядят одинаково. Также они функционировали одинаково. Когда я ввожу часть имени продукта, таблица перерисовывается, и только те продукты содержат введенный текст. Но я использовал часть 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); 


      } 

     } 
    }); 

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

+1

Вы можете найти эту нить полезным http://stackoverflow.com/questions/476848/android-textwatcher-aftertextchanged-vs-textwatcher-ontextchanged –

ответ

14

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(); 
     } 
    }); 
} 

В этом случае, скажем, вы изменили текст с «ч» на «привет», то выход будет:

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

2
  • abstract void afterTextChanged(Editable s)

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

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

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

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

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

Узнать больше об here.

18

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

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

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

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

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

+0

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

+0

У меня не было того, что вы пытаетесь сказать! ontextchanged и aftertextchange выдаст тот же результат –

+1

Когда вы говорите, что текст доступен для редактирования/неизменен, что означает «текст»? – Jonas

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

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

  3. OnTextChanged (CharSequence сек, внутр начало, внутр перед тем, количество INT) - Этот метод вызывается, чтобы уведомить вас, что в течение секунд, количество символов, начинающиеся на старте только заменить старый текст, который имел длину до. Ошибка при попытке внести изменения в s от этого обратного вызова.

6

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

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

enter image description here

beforeTextChanged

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

OnTextChanged

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

afterTextChanged

  • editable является редактируемый текст из EditText. Вы можете изменить его здесь. Это вызовет все события TextWatcher.
  • Вам не предоставлена ​​какая-либо информация о том, что было изменено. Если вы хотите знать, вы можете установить интервал в onTextChanged, а затем посмотреть масштаб здесь.

Когда использовать какой?

Если вы хотите наблюдать за изменениями, используйте beforeTextChanged() или onTextChanged(). Однако вам не разрешено изменять текст CharSequence одним из этих методов.

Если вы хотите изменить текст после его изменения, сделайте это в afterTextChanged().

Код

Вот код, если вы хотите играть с ним вокруг себя.

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    final static int RED_COLOR = Color.parseColor("#fb7373"); 
    final static int GREEN_COLOR = Color.parseColor("#40de83"); 

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

     EditText editText = findViewById(R.id.editText); 
     final TextView tvBeforeText = findViewById(R.id.tvBeforeText); 
     final TextView tvBeforeNumbers = findViewById(R.id.tvBeforeNumbers); 
     final TextView tvAfterText = findViewById(R.id.tvAfterText); 
     final TextView tvAfterNumbers = findViewById(R.id.tvAfterNumbers); 

     editText.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
       SpannableString spannableString = new SpannableString(s); 
       BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(RED_COLOR); 
       spannableString.setSpan(backgroundSpan, start, start + count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       tvBeforeText.setText(spannableString); 
       tvBeforeNumbers.setText("start=" + start + " count=" + count + " after=" + after); 
      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       SpannableString spannableString = new SpannableString(s); 
       BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(GREEN_COLOR); 
       spannableString.setSpan(backgroundSpan, start, start + count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       tvAfterText.setText(spannableString); 
       tvAfterNumbers.setText("start=" + start + " before=" + before + " count=" + count); 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       Log.i("TAG", "afterTextChanged: " + s); 
      } 
     }); 
    } 
} 

activity_main.XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="5dp"> 

    <EditText 
     android:id="@+id/editText" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="20sp" 
     android:text="beforeTextChanged" /> 

    <TextView 
     android:id="@+id/tvBeforeText" 
     android:textSize="17sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/tvBeforeNumbers" 
     android:textSize="17sp" 
     android:text="start=0 count=0 after=0" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="20sp" 
     android:layout_marginTop="20dp" 
     android:text="onTextChanged" /> 

    <TextView 
     android:id="@+id/tvAfterText" 
     android:textSize="17sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/tvAfterNumbers" 
     android:textSize="17sp" 
     android:text="start=0 count=0 after=0" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 
Смежные вопросы