Как применить текстовые эффекты к слову внутри фигурных скобок {} - PullRequest
0 голосов
/ 07 октября 2018

У меня есть текст, который приходит из базы данных SQLite в мой onBindViewHolder в следующей форме: Здравствуйте, я {Alex} .Я хочу иметь возможность регулировать размер или цвет текста внутри {} и скрывать эти {} фигурные скобки из вывода.Итак, последнее желание иметь такой текст: Привет, я Алекс

Впервые я встречаюсь с Regex, может кто-нибудь дать мне краткое пошаговое руководство, как этого добиться.

Я нашел похожий вопрос:

Регулярное выражение, чтобы найти строку, включенную между двумя символами, при ИСКЛЮЧЕНИИ разделителей

Но я не понимаю, как следуетВ моем случае я обрабатываю « (? <= [) (. *?) (? =]) </strong>».

Теперь мой onBindViewHolder выглядит так:

public void onBindViewHolder(final MyViewHolder holder, final int position) {
    final Question question = questionList.get(position);
    holder.tvQuestion.setText(question.getQuestion());
//  holder.tvQuestion.setTextColor(Color.parseColor("#ff0099cc"));

enter image description here

1 Ответ

0 голосов
/ 07 октября 2018

Я не хорошо с регулярным выражением.Но вот ответ на ваш вопрос, который позволит вам получить желаемый результат (получить текст выражения и соответствующим образом отформатировать его).

public CharSequence getFormattedQuestion(Context context, String originalQues, @ColorRes int colorToSet, @DimenRes int textSize) {

    // First we check if the question has the expression
    if (originalQues == null || !originalQues.contains("{") || !originalQues.contains("}")) {
        return originalQues;
    }

    // Then we break the original text into parts

    int startIndex = originalQues.indexOf("{");
    int endIndex = originalQues.indexOf("}");

    // 1) The text before the expression
    String leftPart = startIndex>0 ? originalQues.substring(0, startIndex) : "";

    // 2) The text after the expression (if there is any)
    String rightPart = endIndex == originalQues.length()-1 ? "" : originalQues.substring(endIndex+1);

    // 3) The expression text
    String midPart = originalQues.substring(startIndex+1, endIndex);

    // 4) Format the mid part with the give color (colorToSet) and size (textSize)
    SpannableString spannableMid = new SpannableString(midPart);
    spannableMid.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, colorToSet)), 0, midPart.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    spannableMid.setSpan(new AbsoluteSizeSpan(context.getResources().getDimensionPixelSize(textSize)), 0, midPart.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);


    // check if there is any left part; if so, add it with mid
    CharSequence leftAndMid = leftPart.length()>0 ? TextUtils.concat(leftPart, " ", spannableMid) : spannableMid;

    // Check if there is any right part else return the left and mid
    return rightPart.length()>0 ? TextUtils.concat(leftAndMid, " ", rightPart) : leftAndMid;
}

Таким образом, в основном мы разбиваем исходный вопрос на 3 части.Часть первая, текст перед выражением.Часть 2 текст выражения.Часть 3 текст после выражения.Затем мы форматируем текст выражения (Part2) цветом и размером, используя SpannableString.Затем мы возвращаем новый текст, комбинируя все три.
Затем вы можете использовать его следующим образом:

CharSequence ques = getFormattedQuestion(holder.itemView.getContext(), question.getQuestion(), R.color.blue, R.dimen.text_size);
holder.tvQuestion.setText(ques);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...