编辑时在EditText中保留双色文本块

时间:2015-08-25 20:08:35

标签: android android-edittext

我正在尝试创建一个EditText,其中包含两个不同颜色的文本块:

String strText = txtEditText.getText().toString();
String strFrontPart = strText.substring(0, FRONT_PART_COUNT);
String strBackPart = strText.substring(FRONT_PART_COUNT);
String text = "<font color=#ffffff>" + strFrontPart + "</font>";
text += "<font color=#000000>" + strBackPart + "</font>";
txtEditText.setText(Html.fromHtml(text));

上面的代码成功地将前面的FRONT_PART_COUNT字符转换为白色字符,其余字符转换为黑色。

我的问题是 如何在编辑EditText时实现这一目标?

我显然无法将其放在afterTextChanged()中,因为它会导致无限递归调用。

3 个答案:

答案 0 :(得分:1)

您可以使用setSpan处理程序中Editable param的afterTextChanged方法执行此操作。

样品:

EditText editText
editText.addTextChangedListener(new TextWatcher() {

    final ForegroundColorSpan red = new ForegroundColorSpan(Color.rgb(255, 0, 0));

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

    }

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

    }

    @Override public void afterTextChanged(Editable s) {
        int max = 2;
        if(s.length() < max) max = s.length();
        s.setSpan(red, 0, max, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    }
});

前两个字母为红色。

答案 1 :(得分:1)

    mBugDescription = (EditText) findViewById(R.id.bug_description);
    mWhiteSpan = new ForegroundColorSpan(0xFFFFFFFF);
    mBlackSpan = new ForegroundColorSpan(0xFF000000);

    mBugDescription.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

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

        }

        @Override
        public void afterTextChanged(Editable s) {
            if(s.length() > 0) {
                int FRONT_PART_COUNT = 10;

                s.setSpan(mWhiteSpan, 0, Math.min(s.length(), FRONT_PART_COUNT), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

                if(s.length() > FRONT_PART_COUNT){
                    s.setSpan(mBlackSpan, FRONT_PART_COUNT + 1, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
            }
        }
    });

答案 2 :(得分:-1)

在这种情况下,使用TextWatcher是最好的主意(具体来说,afterTextChanged(Editable s)方法),因为它可以在EditText中编辑后对文本执行修改。

然后您可以通过将其作为txtEditText.addTextChangedListener(TextWatcher t)中的参数传递来添加它。

有关TextWatcher的更多信息: http://developer.android.com/reference/android/text/TextWatcher.html