-1

我已经实现了一个视图,其中 EditText 根据按下的按钮添加和删除。我还使用 TextWatcher 将数字更改为货币格式。直到这里一切正常。

我的问题是当用户输入第一个 EditText 并按下添加按钮时。然后,当用户输入到第二个 EditText 时,输入与第一个 EditText 字符串连接并显示在第二个 EditText 中,并且第一个 EditText 也被连接起来。所以基本上两个 EditText 都以相同的字符串结束。这是我的代码:

    amount = new EditText(this);
    RelativeLayout.LayoutParams etLParams = new RelativeLayout.LayoutParams(
            400, LayoutParams.WRAP_CONTENT);
    etLParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
    amount.setInputType(InputType.TYPE_CLASS_NUMBER);
    amount.setLayoutParams(etLParams);
    amount.setId(AMOUNT);
    amount.setSingleLine();
    amount.requestFocus();
    amount.setCursorVisible(true);
    amount.setGravity(Gravity.RIGHT);
    amount.addTextChangedListener(new TextWatcher(){
        String price="";
        private EditText newAmount = new EditText(DutchPayActivity.this);
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            if(!s.toString().equals(price)){
                String cleanString = s.toString().replaceAll("[$,.]", "");
                long parsed = Long.parseLong(cleanString);
                NumberFormat nf = NumberFormat.getInstance();
                price = nf.format(parsed);
                s.append(price); //gave me error:java.lang.NumberFormatException: 66666666666666666666666666666666

                newAmount.setText(price); //same result as before..
                newAmount.setSelection(price.length());
            }
        }
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

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

        }
    });

我已经尝试过 onTextChanged() 并实现了我的自定义类等等,但就是无法让它工作。

4

2 回答 2

1

有了你的评论,问题就很清楚了。

内部的 TexWatcher 指的是amount,它始终是最后一次运行此代码创建的 EditText。在您运行此代码两次后,要创建两个 EditText,编辑其中任何一个都会触发一个 TextWatcher,该 TextWatcher 将编辑第二个 EditText。

一个解决方案:不要amount在你的 TextWatcher 中做任何事情。使用提供的Editable

或者,amount在您的 TextWatcher 的私有成员中复制。

于 2012-03-07T09:53:07.930 回答
0

我看不到你在哪里声明你的第二个 EditText,但这条线让我怀疑

    amount.setId(AMOUNT);

为什么要为动态创建的组件设置 Id?还有可能是您设置的 ID 与现有 ID 冲突(可能是您的第二个 EditText 组件的 ID?)

这个问题在我听来就像你混淆了你的指针,你的监听器在正确的组件上触发,但是你“setText()”到了一个不指向你认为它应该指向的组件的指针上。

发现这一点的最简单方法是使用调试器(eclipse 附带),在 afterTextChanged() 侦听器上设置断点,并在断点触发时检查变量指向的位置。更不用说您可以轻松地逐步完成文本集过程。

祝你好运!

于 2012-03-07T08:50:03.943 回答