带有不可编辑字符串的Android edittext

时间:2014-01-30 09:51:43

标签: android android-edittext

大家好,我正在做一个在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)

任何我做错的事都请指点我。我们将非常感谢您的帮助。

2 个答案:

答案 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);

当我们可以通过简单的字符串操作完成所有事情时,为什么要使用有时会造成混淆的复杂方法。