2014-01-30 39 views
3

大家好我正在做一个应用程序,它在edittext末尾有一个不可编辑的字符串。Android编辑文本末尾带有不可编辑的字符串

例如,

数量_ __ .00

我想要做这样的事情。

这是我到目前为止已经试过:

etQuantity.addTextChangedListener(new TextWatcher() { 

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

      StringBuilder stringBuilder = new StringBuilder(); 

      stringBuilder.append(".00"); 

      String str = s.toString(); 
      String finalString = str + stringBuilder.toString(); 

      etQuantity.setText(finalString); 
      Log.d("String", "" + finalString); 

     } 

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

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

      StringBuilder stringBuilder = new StringBuilder(); 

      stringBuilder.append(".00"); 

      String str = s.toString(); 
      String finalString = str + stringBuilder.toString(); 

      etQuantity.setText(finalString); 
      Log.d("String", "" + finalString); 

     } 

    }); 

但我得到了一个错误:

01-30 09:49:33.541: E/AndroidRuntime(4294): FATAL EXCEPTION: main 
01-30 09:49:33.541: E/AndroidRuntime(4294): java.lang.StackOverflowError 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1013) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.SpannableStringBuilder.getChars(SpannableStringBuilder.java:913) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.TextUtils.getChars(TextUtils.java:74) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.TextUtils.getChars(TextUtils.java:74) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.MeasuredText.setPara(MeasuredText.java:106) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.StaticLayout.generate(StaticLayout.java:239) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.DynamicLayout.reflow(DynamicLayout.java:284) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.DynamicLayout.<init>(DynamicLayout.java:170) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.makeSingleLayout(TextView.java:5986) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.makeNewLayout(TextView.java:5884) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.checkForRelayout(TextView.java:6423) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.setText(TextView.java:3696) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.setText(TextView.java:3554) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.EditText.setText(EditText.java:80) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.setText(TextView.java:3529) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at com.innovalynx.vms.fragments.SalesOrderDetailFragment$1.afterTextChanged(SalesOrderDetailFragment.java:92) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.setText(TextView.java:3703) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.setText(TextView.java:3554) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.EditText.setText(EditText.java:80) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.setText(TextView.java:3529) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at com.innovalynx.vms.fragments.SalesOrderDetailFragment$1.afterTextChanged(SalesOrderDetailFragment.java:92) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 

我做错了任何事物请点我给它。您的帮助将得到真正的赞赏。

回答

2

onTextChanged()是不修改的EditText文本的地方。

从DOC

这种方法被调用来通知您,S中,在启动开始计数的字符刚刚取代了之前有长度旧文本。 尝试从此回调中更改s是错误的。

所以afterTextChanged()可以做的工作。


使用目前的做法,你需要一些步骤去除TextWatcher,设置文本,以及TextWatcherback添加到EditText上。这样,没有任何内容正在听您的EditText更改,并且不会导致StackOverflowError错误。

etQuantity.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void afterTextChanged(Editable s) { 
     String str = s.toString(); 
     if (str.contains(".00")) { 
      if (! str.endsWith(".00")) { 
       str = str.replace(".00", "") + ".00"; 
      } 
     } else { 
      str = str + ".00"; 
     } 
     etQuantity.removeTextChangedListener(this); // Remove listener 
     etQuantity.setText(str);     // Set Text 
      etQuantity.setSelection(str.length() - 3); // Set selection 
     etQuantity.addTextChangedListener(this); // Add back the listener 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    } 
}); 

另一种方式是添加像TextView多一个视图.00

+0

是的,我删除了我的代码在ontextchanged,但它仍然是一样的。 – Dunkey

+0

添加了布局代码。检查 –

+0

我试过这个,但我想实现这一点。追加部分 – Dunkey

0

如果您想在edittext末尾添加一个不可编辑的字符串,请遵循这些复杂代码的简单方法。

简单地将多余的不可编辑文本连接到可改变的文本。

是否有下面的代码中的任何问题:

String str = "your data"; 
etQuantity.setText(str + ".00"); 

//for restrict user to delete 
etQuantity.setFocusable(false); 
etQuantity.setClickable(false); 

OR

String str = "your data"; 
etQuantity.setText(str + ".00"); 
etQuantity.setKeyListener(null); 

当我们可以做简单的字符串操作的所有东西,那么为什么使用复杂的方法,有时会令混乱。

+0

我想这里面afterTextChanged无济于事 – Dunkey

+0

首先删除所有textwatcher东西,尝试简单地说,怎么我看不到任何东西在这里,这将迫使你使用textwatcher。只需在您的一般方法中写入,如onCreate或任何用户定义。 – Ranjit

+0

你能告诉我你为什么在这里使用textwatcher。仅用于添加额外的文本或其他问题。 – Ranjit

相关问题