Заменить определенную строку на Spans без HTML

Я пытаюсь заменить определенную строку диапазоном.

Например, у меня есть эта строка:

      String s = "redHello greenWorld";

Я хочу заменить "красный" на:

      modifiedText.setSpan(new ForegroundColorSpan(Color.parseColor("#FF0000")), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

и «зеленый» с:

      modifiedText.setSpan(new ForegroundColorSpan(Color.parseColor("#00FF00")), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Итак, я создаю modifiedText следующим образом:

      Spannable modifiedText = new SpannableString(s);

Как я могу заменить определенную строку на Span без HTML?

2 ответа

Раз уж вы спросили об вырезании - надеюсь, вы это имели в виду

      public static void main(String[] args) {
    String str = "redHello greenWorld";
    String lastElement = "";
    String output = "";
    Boolean foundOne = true;
    Map<String, List<Integer>> pos = new HashMap<String, List<Integer>>();
    pos.put("red", new ArrayList<Integer>());
    pos.put("green", new ArrayList<Integer>() );
    String[] temp = {""};
    while (true) {
        for (Map.Entry<String, List<Integer>> entry : pos.entrySet()) {
            temp = str.split(entry.getKey(),2);
            if (temp.length == 1){
                foundOne = false;
            } else {
                foundOne = true;
            if(lastElement.isEmpty()){
                pos.get(entry.getKey()).add(temp[0].length());
            }else {
                pos.get(lastElement).add(temp[0].length() -1 );
                pos.get(entry.getKey()).add(temp[0].length());
            }
            lastElement = entry.getKey();
            output += temp[0];
            str = temp[1];
            }
        }
        if(!foundOne){
            pos.get(lastElement).add(temp[0].length());
            output += temp[0];
            break;
        }
    }

pos содержит позиции в целочисленном списке - в этом примере он содержит следующее:

      red=[0, 5]
green=[6, 5]

Это означает, что красный должен быть от 0 до 0 + 5, а зеленый должен быть от 6 до 6 + 5.

Также output содержит строку с вырезанным red и green

Это действительно плохой код, но он вроде как работает.

не разбивает (подстроку) данный. Он просто меняет атрибуты для данного диапазона с начальным и конечным индексами. Если вы хотите изменить цвет какой-то части, подстрока (или вырезка) не нужна. Просто используйте начальный и конечный индексы, для какой части вы хотите изменить, а остальное останется прежним (исходным). В вашем случае в соответствии с вашим вопросом вы хотите изменить цвет красных и зеленых слов, поэтому просто используйте 2 setSpan методы с начальным и конечным индексами для этих слов.

      String s = "redHello greenWorld";
SpannableString modifiedText = new SpannableString(s);

//Change the color for 'red' word
modifiedText.setSpan(new ForegroundColorSpan(Color.parseColor("#FF0000")), 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

//Change the color for 'green' word
modifiedText.setSpan(new ForegroundColorSpan(Color.parseColor("#00FF00")), 9, 14, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Несмотря на то, что он все еще, вы можете использовать его как, если хотите установить как Text для тебя View. Например, если вы хотите установить это String на ваш TextView использовать setText() метод с вашим SpannableString.

      textView.setText(modifiedText);
Другие вопросы по тегам