将“最终”修改器添加到“编辑文本”后应用程序崩溃

时间:2013-07-07 15:55:43

标签: android events android-edittext

我有一个编辑文本,我需要挂钩到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) {

              }
            });

请帮我解决这个问题

3 个答案:

答案 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,这是不需要的。