TextWatcher的onTextChanged,beforeTextChanged和afterTextChanged之间的差异

时间:2013-11-29 04:28:59

标签: android textwatcher android-textwatcher

在我的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 个答案:

答案 0 :(得分:32)

beforeTextChangedonTextChanged的参数起初有点难以理解。看到它们在示例中使用可能会有所帮助。请观看以下演示几次。注意计数。

  • 红色突出显示是即将由绿色文本替换的旧文本。
  • 绿色突出显示是刚刚替换红色文本的新文本。

enter image description here

beforeTextChanged

  • start是红色突出显示文本的开始索引(即将被删除)
  • count红色突出显示文字的长度(即将被删除)
  • after绿色突出显示文字的长度(即将添加)

onTextChanged

  • start是绿色突出显示文本的起始索引(刚刚添加) 这与start的{​​{1}}相同。
  • beforeTextChanged红色突出显示文本的长度(刚被删除)。
    这与before的{​​{1}}相同。
  • count绿色突出显示文字的长度(刚刚添加)。
    这与beforeTextChanged的{​​{1}}相同。

afterTextChanged

  • count是EditText中的可编辑文本。你可以在这里改变它。这样做会再次触发所有after个事件。
  • 您没有获得有关更改内容的任何信息。如果您想知道,可以在beforeTextChanged中设置范围,然后在此处查找范围。

何时使用?

如果您想观察所做的更改,请使用editableTextWatcher。但是,您不能更改这两种方法中的onTextChanged文本。

如果您想在更改文本后进一步修改文本,请在beforeTextChanged()

中执行

代码

如果您想自己玩它,可以使用以下代码。

MainActivity.java

onTextChanged()

activity_main.xml中

CharSequence

答案 1 :(得分:22)

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”
  上:“你好”   之后:“嗨”

答案 2 :(得分:20)

Android TextChangedListener是一种触发器,在输入字段的文本更改时调用。

TextChangedListener有三个事件。

1.beforeTextChanged:这意味着字符即将被替换为一些新文本。该文本是不可编辑的。当您需要查看即将更改的旧文本时,将使用此事件。

2.onTextChanged:已进行更改,某些字符已被替换。该文本是不可编辑的。当您需要查看文本中的哪些字符是新的时,可以使用此事件。

3.afterTextChanged:与上述相同,但现在文字是可编辑的。当您需要查看并可能编辑新文本时,将使用此事件。

答案 3 :(得分:2)

  
      
  • 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内通知您计数   从开头开始的字符刚刚替换了旧文本   之前的长度。

您可以更多地了解here

答案 4 :(得分:0)

  
      
  1. afterTextChanged (可编辑s) - 更改文本时调用此方法。因为您所做的任何更改都会导致此问题   要递归调用的方法,你必须要注意   在这里执行操作,否则可能导致无限循环。

  2.   
  3. beforeTextChanged (CharSequence s,int start,int count,int after) - 调用此方法通知您s内的计数   从开始开始的字符即将被新文本替换   之后的长度。尝试对s进行更改是错误的   这个回调。

  4.   
  5. onTextChanged (CharSequence s,int start,int before,int count) - 调用此方法通知您s内的计数   从开头开始的字符刚刚替换了旧文本   之前的长度。尝试对s进行更改是错误的   这个回调。

  6.