如何在设置数据到EditText上禁用TextWatcher

8

我正在使用 EditText 上的 TextWatcher。当我在 edittext 中输入内容时,它完美地工作,但当我从数据库中设置数据到 edittext 时,会出现 NullPointerException。我使用了 onTouchListener 来处理这个 Edittext 。我的问题是,我能否检查 TextWatcher 只在触摸事件为真时才起作用的条件。

EditText det=(EditText) findViewById(R.id.det);
    det.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            System.out.println(v.getId());
            d_id=v.getId();
            if (event.getAction() == MotionEvent.ACTION_UP) {
                getPopUp(det);
            }
            return false;
        }
    });

当我在det上调用setText时,它会进入TextWatcher。
det.setText(ft.get_det().toString());

文本监视器

                    @Override
            public void afterTextChanged(Editable string) {
                try {

                    int rp=0;
                    det=(EditText)findViewById(d_id);
                    s_id=d_id-4;
                    sev=(EditText)findViewById(s_id);
                    o_id=d_id-2;
                    occ=(EditText)findViewById(o_id);
                    rp=d_id+1;
                    rpn=(TextView)findViewById(rp);
                    if (sev.getText().length() > 0
                            || occ.getText().length() > 0
                            || sev.getText().length() == 0) {
                        if (string.length() > 0) {
                            int s, o, d, r;
                            System.out.println(sev.getId());
                            System.out.println(det.getId());
                            s = Integer.parseInt(sev.getText().toString());
                            o = Integer.parseInt(occ.getText().toString());
                            d = Integer.parseInt(det.getText().toString());
                            r = s * o * d;
                            String m = r + "";
                            rpn.setText(m);                         
                        } else {
                            // det.setText("");
                            // rpn.setText("");
                             System.out.println("In else");
                        //  makeToast();
                        }
                    }

                } catch (Exception e) {
                    det.setText("");
                    rpn.setText("");
                    System.out.println("IN Exception");
                    makeToast();
                }
            }
        };
2个回答

29

创建一个如下的TextWatcher:

Create a TextWatcher like below

TextWatcher textWatcher=new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }
    };

然后在EditText中调用此方法添加:

   EditText.addTextChangedListener(textWatcher);

并且移除调用

   EditText.removeTextChangedListener(textWatcher);

6
我通过设置一个全局布尔变量来解决这个问题。在 onTouchListener 中将此变量设置为 true,并在 afterTextChanged 方法中检查条件,看变量是 true 还是 false。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接