0 / 0 / 0
Регистрация: 27.06.2015
Сообщений: 96
1

Spannable - цветной текст

14.05.2016, 11:44. Показов 2214. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добра
Работая с Spannable наткнулся на одну проблему.
В приложении должен текст менять цвет, мой код выглядит так:

Java
1
2
3
4
5
    public Spannable colorText(String str, String str2, int cnt){
        Spannable text = new SpannableString(str);
        text.setSpan(new ForegroundColorSpan(Color.GREEN), str.indexOf(str2), str.indexOf(str2) + cnt, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        return text;
    }
Данный метод принимает String str - основной текст, String str2 - слово которые должно закрсится, int cnt - на сколько символов.
Но не в этом суть, предположим я использую так:
Java
1
text1.setText(colorText("hi world, hi all", "hi", 2));
Я хочу закрасить все слова ("hi"), а он закрашивает только первое попавшие слово, именно только одно...
В этом и вся проблема.
Спасибо заранее.

Добавлено через 15 минут
Может кто знаешь другой способ, для цветного текста, но есть одно но, текст пишет пользователь, текст не устанавливается программно в приложении.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2016, 11:44
Ответы с готовыми решениями:

Цветной текст в textview
Вся фишка в том, чтобы установить текст не для строковой переменной, а для конкретной фразы. Т.е. к...

Нарисовать на канвасе цветной текст
Подскажите, может кто сталкивался... Решил начать писать свою реалицию компонента из...

Цветной текст в с++
Подскажите код чтобы программа выводила любым(красным синим хоть киким цветом любой текст ) с...

Цветной текст
Здравствуйте, делаю небольшую программку, нужно будет сделать окошко(не консоль) в котором выводить...

8
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
15.05.2016, 13:12 2
непонятно где пользователь пишет текст
в EditText, а потом нажимает педаль и текст применяется на какое-то TextView или он печатает и этот текст меняет цвет прямо в EditText или в другом textview
0
0 / 0 / 0
Регистрация: 27.06.2015
Сообщений: 96
19.05.2016, 20:45  [ТС] 3
Паблито, в моем случае пользователь печатает текст в EditText, если он совпадает с нужным мне текстом например "hello" - то этот текст меняет цвет. Пытаюсь через данный метод, но не выходит, помогите пожалуйста.
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
20.05.2016, 16:22 4
Лучший ответ Сообщение было отмечено ProGraf как решение

Решение

я тут немного подняпрягся и сделал кастомный EditText, на мой взгляд это удобнее чем городить все методы где-то в активити или фрагменте
1. сам класс, можно особо не вчитываться, магия уже настроена
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import android.content.Context;
import android.text.Editable;
import android.text.Spannable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.style.BackgroundColorSpan;
import android.util.AttributeSet;
import android.widget.EditText;
 
import java.util.ArrayList;
 
public class CustomEditText extends EditText {
 
    private final ArrayList<Integer> posList = new ArrayList<>();
    private String highlightText;
    private int color;
 
    public CustomEditText(Context context) {
        super(context);
        init();
    }
 
    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
 
    private void init() {
        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) {
                posList.clear();
                if (s.length() > 0 && !TextUtils.isEmpty(highlightText)) {
                    findOccurrences();
                }
                if (!posList.isEmpty()) highlight(s);
            }
        });
    }
 
    private void findOccurrences() {
        String text = getText().toString();
        int index = text.indexOf(highlightText);
        while (index >= 0) {
            posList.add(index);
            index = text.indexOf(highlightText, index + 1);
        }
    }
 
    private void highlight(Spannable where) {
        for (Integer pos : posList) {
            int spanStart = pos;
            int spanEnd = spanStart + highlightText.length();
            where.setSpan(new BackgroundColorSpan(color), spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
 
    public void setHighlightText(String highlightText, int color) {
        this.highlightText = highlightText;
        this.color = color;
    }
}

2. кусок активити, где показано как это вызывается
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        CustomEditText editText = (CustomEditText) findViewById(R.id.editText);
        editText.setHighlightText("hello", Color.RED);
    }
}

3. пример разметки, там где указан кастомный EditText надо будет поменять имя пакета на свое
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/topAppContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <com.example.mytestapplication.CustomEditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
 
</FrameLayout>

4. PROFIT
Spannable - цветной текст
3
0 / 0 / 0
Регистрация: 27.06.2015
Сообщений: 96
20.05.2016, 18:16  [ТС] 5
Паблито, да вы волшебник, вау, спасибо большое!
0
0 / 0 / 0
Регистрация: 27.06.2015
Сообщений: 96
31.05.2016, 19:48  [ТС] 6
Паблито, извините, я немного разобрался с вашим кодом, я пытаюсь добавить множество слов, пробую через массив, использую split для нахождения слов, далее уже все массив.
Будут вопросы обращусь, вы не против?
0
Pablito
31.05.2016, 19:52
  #7

Не по теме:

только не в личке
я то на форуме потому и торчу часто - если вопрос интересный то пытаюсь решить, ручки запоминают и людям иногда польза )
про массив там по идее ничего сложного не должно быть

0
0 / 0 / 0
Регистрация: 27.06.2015
Сообщений: 96
31.05.2016, 22:06  [ТС] 8
Паблито, выручайте, я примерно добавил два слова, знаете каким методом? Методом - повтора вашего кода...
Вы бы не могли помочь с стабилизацией?
Код
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package com.mycompany.pas;
 
import android.content.*;
import android.text.*;
import android.text.style.*;
import android.util.*;
import android.widget.*;
import java.util.*;
 
public class CustomEditText extends EditText {
 
    private final ArrayList<Integer> posList = new ArrayList<>();
    private final ArrayList<Integer> posList1 = new ArrayList<>();
    private String[] highlightText = new String[100];
    private int color;
    
 
    public CustomEditText(Context context) {
        super(context);
        init();
    }
 
    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
 
    private void init() {
        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) {
                    posList.clear();
                    if (s.length() > 0 && !TextUtils.isEmpty(highlightText[0])) {
                        findOccurrences();
                    }
                    if (s.length() > 0 && !TextUtils.isEmpty(highlightText[1])) {
                        findOccurrences();
                    }
                    if (!posList.isEmpty()) highlight(s);
                    if (!posList1.isEmpty()) highlight(s);
                }
            });
    }
 
    private void findOccurrences() {
        String text = getText().toString();
        int index = text.indexOf(highlightText[0]);
        int index2 = text.indexOf(highlightText[1]);
        while (index >= 0) {
            posList.add(index);
            index = text.indexOf(highlightText[0], index + 1);
        }
        while (index2 >= 0) {
            posList1.add(index2);
            index2 = text.indexOf(highlightText[1], index2 + 1);
        }
    }
 
    private void highlight(Spannable where) {
        for (Integer pos : posList) {
            if(highlightText[0]=="begin"){
            int spanStart = pos;
            int spanEnd = spanStart + highlightText[0].length();
            where.setSpan(new ForegroundColorSpan(color), spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
        for (Integer pos : posList1) {
            if(highlightText[1]=="end."){
                int spanStart = pos;
                int spanEnd = spanStart + highlightText[1].length();
                where.setSpan(new ForegroundColorSpan(color), spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
    }
   
    
    public void setHighlightText(String highlightText, int color) {
        this.highlightText[0] = "begin";
        this.highlightText[1] = "end.";
        this.color = color;
    }
}


Добавлено через 14 минут
Паблито, нет, стойте, не нужно, я разберусь, слишком много помощи, я все почитаю о данных методах, я добавлю сам, спасибо за помощь, еще увидимся.
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
01.06.2016, 13:19 9
немного переделал - в коде нашел баг, не очищались Spannable, если вернуться в строке и изменить подсвеченное слово, оно не снимало подсветку
поэтому добавлен метод clearSpans и метод теперь принимает массив строк, вместо одной
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import android.content.Context;
import android.text.Editable;
import android.text.Spannable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.style.BackgroundColorSpan;
import android.util.AttributeSet;
import android.widget.EditText;
 
import java.util.ArrayList;
 
public class CustomEditText extends EditText {
 
    private final ArrayList<Integer> posList = new ArrayList<>();
    private String[] highlights;
    private int color;
 
    public CustomEditText(Context context) {
        super(context);
        init();
    }
 
    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
 
    private void init() {
        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) {
                clearSpans(s);
                for (String word: highlights) {
                    posList.clear();
                    if (s.length() > 0 && !TextUtils.isEmpty(word)) findOccurrences(word);
                    if (!posList.isEmpty()) highlight(s, word);
                }
            }
        });
    }
 
    private void findOccurrences(String word) {
        String text = getText().toString();
        int index = text.indexOf(word);
        while (index >= 0) {
            posList.add(index);
            index = text.indexOf(word, index + 1);
        }
    }
 
    private void highlight(Spannable where, String word) {
        for (Integer pos : posList) {
            int spanStart = pos;
            int spanEnd = spanStart + word.length();
            where.setSpan(new BackgroundColorSpan(color), spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
 
    private void clearSpans(Spannable where) {
        final BackgroundColorSpan[] spans = where.getSpans(0, where.length(), BackgroundColorSpan.class);
        for (BackgroundColorSpan s: spans) where.removeSpan(s);
    }
 
    public void setHighlightText(String[] highlighs, int color) {
        this.highlights = highlighs;
        this.color = color;
    }
}

ps: можно к мой код и не подглядывать, но пусть останется, вдруг пригодится кому-то
0
01.06.2016, 13:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2016, 13:19
Помогаю со студенческими работами здесь

Цветной текст
Здравствуйте. Можно ли печатать в текстбоксе цветными клавишами ?? То есть сделать такой себе...

Цветной текст
Ребят, есть такая проблемка, мне нужно сделать что-то вроде редактора текстового при разработке...

Цветной текст
Помогите пожалуйста сделать вывод другим цветом всех чисел над диагональю в двумерном массиве ...

Цветной текст в С
Доброго времени суток. Помогите разобраться, как выделять текст в консоле. Мне надо выделить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru