【问题标题】:Change the colour of text as the user types hash tags在用户键入主题标签时更改文本颜色
【发布时间】:2016-05-17 23:42:26
【问题描述】:

我正在开发一个用户可以将内容发布到提要的应用程序。在我的编辑文本(用于撰写)中,文本颜色为灰色。但是,当用户键入哈希标签时,例如#help 我需要在他们键入时将该文本着色为黑色,因此当用户键入“#”时,文本必须着色为黑色,直到他们开始一个新单词,然后文本颜色需要恢复为灰色。

我一直在尝试使用文本观察器和可扩展的字符串来着色。

这是我使用 textwatcher onTextChanged 所做的事情

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


            //Remove Text watcher to prevent infinite look
            mTextField.removeTextChangedListener(contentFieldWatcher);
            String startChar = null;
                startChar = Character.toString(s.charAt(start));
                L.i(getClass().getSimpleName(), "CHARACTER OF NEW WORD: " + startChar);


  if (startChar.equals("#")) {
                     tagCheck(s.toString().substring(start), start, start + count);
                }
            }

tagCheck方法

private void tagCheck(String s, int start, int end) {
        mSpannable.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.black_colour)), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }

mSpannable 是一个 Spannable。

这个方法的问题是'#'显示为startChar,但是当用户输入下一个字符(符号或字母)时,它会显示为startChar。好像用户键入了 santa - 's' 仍然是 startChar。所以我面临的问题是他如何在用户键入主题标签时为文本动态着色。

所以普通字母可以正常工作,但是当你使用符号时它就不行了。我希望这个问题很清楚..我已经看了几天了,一切都变得模糊了:)

【问题讨论】:

标签: android android-edittext textwatcher spannable


【解决方案1】:

我尝试并找到了解决方案

您可以使用以下代码

Spannable mspanable;
int hashTagIsComing = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    final EditText edt = (EditText) findViewById(R.id.editText1);

    mspanable = edt.getText();

    edt.addTextChangedListener(new TextWatcher() {

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

            String startChar = null;

            try{
                startChar = Character.toString(s.charAt(start));
                Log.i(getClass().getSimpleName(), "CHARACTER OF NEW WORD: " + startChar);
            }
            catch(Exception ex){
                startChar = " ";
            }

                if (startChar.equals("#")) {
                     tagCheck(s.toString().substring(start), start, start + count);
                     hashTagIsComing++;
                }

                if(startChar.equals(" ")){
                    hashTagIsComing = 0;
                }

                if(hashTagIsComing != 0) {
                    tagCheck(s.toString().substring(start), start, start + count);
                    hashTagIsComing++;
                }
        }

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

        }

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

        }
    });



}


private void tagCheck(String s, int start, int end) {
    mspanable.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.color)), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}

【讨论】:

  • 请注意,您最常将标签从不适当的字符中清除
  • 自动建议有问题,如果用户点击自动建议,我们会失去着色
【解决方案2】:

我设法实现了您所描述的行为,只是我将彩色文本设置在单独的 TextView 上。请参阅下面的屏幕截图和代码。我希望这会有所帮助

在监听器的 afterTextChanged 中:

@Override
public void afterTextChanged(Editable s) {
     editText.removeTextChangedListener(textWatcher);
     colorText(s.toString());
}

查找“#”字符和彩色文本直到第一个空格的方法:

private void colorText(String s) {
    if (!TextUtils.isEmpty(s)) {
        Spannable spannable = new SpannableString(s);
        int position = 0;
        position = s.indexOf("#", position);
        while (position != -1) {
            colorSpannable(spannable, position, s.indexOf(" ", position + 1) != -1 ? s.indexOf(" ", position + 1) : s.length());
            position = s.indexOf("#", position + 1);
        }
        textView.setText(spannable);
    }
    editText.addTextChangedListener(textWatcher);
}

colorSpannable 只是将颜色从索引开始添加到索引结束

private void colorSpannable(Spannable s, int start, int end){
    s.setSpan(new ForegroundColorSpan(Color.BLUE), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    相关资源
    最近更新 更多