2012-03-07 64 views
-1

我已经实现了一个视图,其中EditText根据按下的按钮添加和删除。我也使用TextWatcher将数字转换为金钱格式。一切工作正常,直到这里。EditText,TextWatcher帮助,继续获取前一个字符串

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

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()和实现我的自定义类等,但就是无法得到它的工作。

+7

请让您的标题更有建设性 – Ben 2012-03-07 08:38:22

+4

*“认真地说我对此感到厌恶” - - 我也是。没有人阅读[常问问题](http://stackoverflow.com/faq)如何在这里问一个适当的问题了。 – 2012-03-07 08:38:58

+0

其他EditText在哪里? – 2012-03-07 08:39:28

回答

0

我不能看到你申报你的第二个EditText上,但此行让我怀疑

amount.setId(AMOUNT); 

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

这个问题听起来像你混淆了你的指针,你的侦听器触发了正确的组件但是你将“setText()”放到一个指向你指定的组件的指针上。

发现这个最简单的方法是使用调试器(eclipse自带),在afterTextChanged()监听器上设置断点,以及何时断点触发器检查变量指向的位置。 更何况,你可以轻松地通过文本设置过程。

祝你好运!

+0

金额实际上是全球变量。所以我没有申报另一个。我只是再次启动它。我把它放在了全球范围内,因为TextWatcher不会让我以其他方式使用它。 – Jae 2012-03-07 08:58:25

1

随着您的意见,问题是明确的。

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

解决方案:不要对您的TextWatcher中的amount执行任何操作。使用提供的Editable

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

+0

我认为这可能是解决方案,但不幸的是我远离了我的编程计算机,所以我无法尝试它......虽然朱利安我有几个问题。当你说使用可编辑时,你的意思是使用像append这样的方法来改变EditText中的文本?你是用重复的'amount'来表示什么意思?在此先感谢 – Jae 2012-03-07 12:30:45

+1

@Jae,是的。将一个私人成员添加到TextWatcher,您可以将其分配给'amount'的值。 'amount'将继续只保存最后创建的EditText,但现在每个TextWatcher的方法都可以在正确的EditText上运行。 – 2012-03-07 13:29:24

+0

我刚刚尝试了两种方法,但是重复'amount'给了我相同的结果...并且使用append给我一个错误,一旦我输入了某些内容...我将更新上面的代码。非常感谢您的帮助。 – Jae 2012-03-07 23:39:02