在我的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);
}
}
});
那么有人可以给我这三个问题吗?
答案 0 :(得分:32)
beforeTextChanged
和onTextChanged
的参数起初有点难以理解。看到它们在示例中使用可能会有所帮助。请观看以下演示几次。注意计数。
start
是红色突出显示文本的开始索引(即将被删除)count
是红色突出显示文字的长度(即将被删除)after
是绿色突出显示文字的长度(即将添加)start
是绿色突出显示文本的起始索引(刚刚添加)
这与start
的{{1}}相同。beforeTextChanged
是红色突出显示文本的长度(刚被删除)。before
的{{1}}相同。count
是绿色突出显示文字的长度(刚刚添加)。beforeTextChanged
的{{1}}相同。count
是EditText中的可编辑文本。你可以在这里改变它。这样做会再次触发所有after
个事件。beforeTextChanged
中设置范围,然后在此处查找范围。如果您想观察所做的更改,请使用editable
或TextWatcher
。但是,您不能更改这两种方法中的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)
afterTextChanged (可编辑s) - 更改文本时调用此方法。因为您所做的任何更改都会导致此问题 要递归调用的方法,你必须要注意 在这里执行操作,否则可能导致无限循环。
beforeTextChanged (CharSequence s,int start,int count,int after) - 调用此方法通知您s内的计数 从开始开始的字符即将被新文本替换 之后的长度。尝试对s进行更改是错误的 这个回调。
- 醇>
onTextChanged (CharSequence s,int start,int before,int count) - 调用此方法通知您s内的计数 从开头开始的字符刚刚替换了旧文本 之前的长度。尝试对s进行更改是错误的 这个回调。