我有一个编辑文本,我需要挂钩到textchanged事件来执行任务。我首先为edittext定义了overrdiimg但是在文本chnaged事件中添加了文本提取代码后,IDE标记了一个错误并自动更正了它在行中添加final
修饰符
像这样
final EditText et1=(EditText)findViewById(R.id.editText1);
在对文本进行处理后,应用程序就开始了,所以我尝试先将edittext重新检索2次以挂钩到事件然后获取文本,然后应用程序崩溃。 IDE之前曾提示我在类似的情况下添加最终修饰符,但它已经崩溃了应用程序,所以我在需要对象的位置添加了fetchbyID
EditText et1=(EditText)findViewById(R.id.editText1);
et1.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
new Thread(new Runnable() {
public void run() {
ImageView img=(ImageView)findViewById(R.id.imageView1);
EditText et=(EditText)findViewById(R.id.editText1);
img.setImageBitmap(thumbnail);
Bitmap b = workwithtext(thumbnail,et.getText().toString(),10);
img.setImageBitmap(b);
}
}).start();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
请帮我解决这个问题
答案 0 :(得分:1)
崩溃是因为您正在尝试从非UI线程修改UI组件。
new Thread(new Runnable() {
public void run() {
ImageView img=(ImageView)findViewById(R.id.imageView1);
//...
img.setImageBitmap(thumbnail);
//...
}
}).start();
答案 1 :(得分:0)
将EditText et1作为类中的字段而不是局部变量。
答案 2 :(得分:0)
您正在从背景therad更新ui,这是不可能的。同时将视图初始化移至onCreate
。
img.setImageBitmap(b); // updating ui from thread not possible
使用runOnUiThread
更新ui
runOnUiThread(new Runnable() {
public void run() {
// update ui here
}
});
请注意,每次调用onTextChanged
时都会启动一个新线程,这是不好的。此外,您每次都在线程运行方法初始化imageview和editext,这是不需要的。