Как установить другой цвет текста текста и сделать этот текст кликабельным?

В моем приложении я хочу использовать текстовое представление, у которого половина текста должна быть черной, а вторая половина должна быть зеленой, также я хочу, чтобы зеленая часть была кликабельной. Я нашел несколько сообщений, которые показывают, как изменить цвет или как сделать кликабельным, но я не могу найти комбинацию обоих. Я сам реализовал эту идею, но проблема в том, что строка, которая должна быть кликабельной, не кликабельна. Как это исправить? Любая помощь будет оценена. Вот мой код

String firststring="Hello i am a textiew";
lString secondstring="ClickMe";
SpannableStringBuilder builder = new SpannableStringBuilder();
SpannableString firstStringSpannable = new SpannableString(firststring);
firstStringSpannable .setSpan(new ForegroundColorSpan(Color.BLACK), 0, firststring.length(), 0);
builder.append(firstStringSpannable );

String space = " ";
SpannableString spaceSpannable = new SpannableString(space);
builder.append(spaceSpannable);

SpannableString secondSpannable = new SpannableString(secondstring);
secondSpannable .setSpan(new ForegroundColorSpan(Color.GREEN), 0, 
builder.append(secondSpannable );

textview.setText(builder, TextView.BufferType.SPANNABLE);
String comepleteString = firststring + " " + secondstring;
SpannableString spannableString = new SpannableString(comepleteString);
int startIndex = comepleteString.indexOf(secondstring);
int endIndex = startIndex + secondstring.length();

Spannable Spannable = (Spannable) textview.getText();
ClickableSpan myClickableSpan = new ClickableSpan() {
    @Override
    public void onClick(View widget) {
//performing some function
    }
};
Spannable.setSpan(myClickableSpan, startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

3 ответа

Решение

Использование метода setHighlightColor() работает большую часть времени:

textView.setHighlightColor(ContextCompat.getColor(context, R.color.green));

ПРИМЕЧАНИЕ. Обновленный код для 2 разных строк в 1 TextView, а вторая строка будет окрашен и доступен для нажатия.

Установите цвет по умолчанию для вашего TextView как ЧЕРНЫЙ.

Вот простой пример:

String stringFirst = "..."
String stringSecond = "..."

SpannableString spannable = new SpannableString(stringFirst + stringSecond);
    ClickableSpan clickableSpan = new ClickableSpan() {
        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
        }

        @Override
        public void onClick(View widget) {
            //Do your click action
        }
    };
    spannable.setSpan(clickableSpan, stringFirst.length()-1, stringFirst.length() + stringSecond.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

textView.setText(spannable);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setHighlightColor(ContextCompat.getColor(context, R.color.green));

Если это не работает, добавьте строку ниже

ds.setColor(ContextCompat.getColor(context, R.color.green));

в ваш метод updateDrawState. Это выглядит так:

String stringFirst = "..."
String stringSecond = "..."

SpannableString spannable = new SpannableString(stringFirst + stringSecond);
    ClickableSpan clickableSpan = new ClickableSpan() {
        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setColor(ContextCompat.getColor(context, R.color.green));
        }

        @Override
        public void onClick(View widget) {
            //Do your click action
        }
    };
    spannable.setSpan(clickableSpan, stringFirst.length()-1, stringFirst.length() + stringSecond.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

textView.setText(spannable);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setHighlightColor(ContextCompat.getColor(context, R.color.green));

Надеюсь, это поможет вам:)

protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
{
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);
    int flags = strBuilder.getSpanFlags(span);
    ClickableSpan clickable = new ClickableSpan() {
        public void onClick(View view) {
            // Do something with span.getURL() to handle the link click...
        }
    };
    strBuilder.setSpan(clickable, start, end, flags);
    strBuilder.removeSpan(span);
}

protected void setTextViewHTML(TextView text, String st1, String st2)
{
    CharSequence sequence = Html.fromHtml("<font color='green'>"+st1+"</font><font color='black'>"+st2+"</font");
    SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
    URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);   
    for(URLSpan span : urls) {
        makeLinkClickable(strBuilder, span);
    }
    text.setText(strBuilder);
    text.setMovementMethod(LinkMovementMethod.getInstance());       
}

Прежде всего, вы можете поместить два текстовых просмотра по одному горизонтально. чем после символа подсчета класса активности данной строки, чем после разделения двух одинаковых номеров (пример: 26 символов с делением на 2, поэтому в основном ANS будет 13 символов в первом текстовом представлении и второй 13 символов во втором текстовом представлении)

как это работает:

string msg;
int lenght = msg.length();
int half = lenght/2;

String msg1 = msg.subString(0,half);
String msg2 = msg.subString(half,lenght);

Это две строки, установленные в вашем textView, и которые вы хотите, чтобы событие клика, чем PLZ, управляете им по вашему требованию. TextView вы также можете изменить цвет textview программно или xml-файл.

Другие вопросы по тегам