大家好,我正在做一个在edittext末尾有一个不可编辑字符串的应用程序。
例如,
数量 _ __ .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)
任何我做错的事都请指点我。我们将非常感谢您的帮助。
答案 0 :(得分:2)
onTextChanged()不是修改EditText文字的地方。
来自doc
调用此方法通知您,在s中,从start开始的计数字符刚刚替换了之前具有长度的旧文本。 尝试从此回调中更改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
的视图。
答案 1 :(得分: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);
当我们可以通过简单的字符串操作完成所有事情时,为什么要使用有时会造成混淆的复杂方法。