Хотите добавить верхние индексы с номерами TextView, используя StringBuilder - PullRequest
0 голосов
/ 19 марта 2019
public class SuperscriptFormatter {
    private static final String SUPERSCRIPT_REGEX = "(?<=\\b\\d{0,10})(st|nd|rd|th)(?=\\b)";
    private static final Pattern PATTERN = Pattern.compile(SUPERSCRIPT_REGEX);
    private static final float PROPORTION = 0.5f;

    private final SpannableStringBuilder stringBuilder;

    public SuperscriptFormatter (@NonNull SpannableStringBuilder stringBuilder) {
        this.stringBuilder = stringBuilder;
    }

    public void format(TextView textView) {
        CharSequence text = textView.getText();
        Matcher matcher = PATTERN.matcher(text);
        stringBuilder.clear();
        stringBuilder.append(text);
        while (matcher.find()) {
            int start = matcher.start();
            int end = matcher.end();
            createSuperscriptSpan(start, end);
        }
        textView.setText(stringBuilder);
    }

    private void createSuperscriptSpan(int start, int end) {
        SuperscriptSpan superscript = new SuperscriptSpan();
        RelativeSizeSpan size = new RelativeSizeSpan(PROPORTION);
        stringBuilder.setSpan(superscript, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        stringBuilder.setSpan(size, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
}

Проблема в том, что я не могу получить эти индексы с номером.Я передаю «1», «2» как текст и matcher.find(), возвращая ложное значение каждый раз, я не знаю, что происходит ни с шаблоном, ни с моим текстом.Я хочу, чтобы 1-й, 2-й, 3-й ... и т. Д. Как текст

Ответы [ 2 ]

1 голос
/ 19 марта 2019

В приведенном выше коде вы должны установить текст в вашем классе деятельности или XML-файл в папке макета.

textView.setText( "21st, 22nd, 11th, 13th");

или текстовый файл xml

android:text= "21st, 22nd, 11th, 13th"

как это, там нет автоматического надстрочного знака.

0 голосов
/ 21 марта 2019

Я написал свою собственную логику для добавления верхнего индекса с числами. Здесь я работаю над адаптером RecyclerView, используя kotlin, я делюсь кодом для onBindViewHolder.

    var stringBuilder: SpannableStringBuilder = SpannableStringBuilder()


  override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
    // for 1 till 9
    if (yourNo  in 1..9) {
        if (yourNo  == 1)
            changeSuperScripts(1, 3, yourNo + "st", holder.textView)
        else if (contestStandingItem.rank == 2)
            changeSuperScripts(1, 3, yourNo + "nd", holder.textView)
        else if (contestStandingItem.rank == 3) {
            changeSuperScripts(1, 3, yourNo + "rd", holder.textView)
        } else
            changeSuperScripts(1, 3, yourNo + "th", holder.textView)
    }

    // for 10 till 19
    else if (yourNo  in 10..19)
        changeSuperScripts(2, 4, yourNo  + "th", holder.textView)


    // for 20 till 99
    else if(yourNo  in 20..99) {
         if (yourNo  % 10 == 0)
            changeSuperScripts(2, 4, yourNo  + "th", holder.textView)
        else if (yourNo  % 10 == 1)
            changeSuperScripts(2, 4, yourNo  + "st", holder.textView)
        else if (yourNo  % 10 == 2)
            changeSuperScripts(2, 4, yourNo  + "nd", holder.textView)
        else if (yourNo  % 10 == 3)
            changeSuperScripts(2, 4, yourNo  + "rd", holder.textView)
        else
            changeSuperScripts(2, 4, yourNo  + "th", holder.textView)
    }

    // for 100 till 999
    else if (yourNo  in 100..999){
        if (yourNo  % 10 == 0)
            changeSuperScripts(3, 5, yourNo  + "th", holder.textView)
        else if (yourNo  % 10 == 1)
            changeSuperScripts(3, 5, yourNo  + "st", holder.textView)
        else if (yourNo  % 10 == 2)
            changeSuperScripts(3, 5, yourNo  + "nd", holder.textView)
        else if (yourNo  % 10 == 3)
            changeSuperScripts(3, 5, yourNo  + "rd", holder.textView)
        else
            changeSuperScripts(3, 5, yourNo  + "th", holder.textView)
    }

}

// start и end - это индексы, с которых начинается и заканчивается суперскрипт

     fun changeSuperScripts(start: Int, end: Int, text: String, textView: TextView) {
    stringBuilder.clear()
    stringBuilder.append(text)
    val formatter = OrdinalSuperscriptFormatter.getInstance(stringBuilder)
    formatter.createSuperscriptSpan(start, end, textView)
}

// это отдельный класс, написанный на Java для преобразования текста в верхний индекс, я сделал его синглтоном для использования одного и того же объекта каждый раз (только для производительности)

открытый класс OrdinalSuperscriptFormatter {

public static OrdinalSuperscriptFormatter ordinalSuperscriptFormatter;

private static final String SUPERSCRIPT_REGEX = "(?<=\\b\\d{0,10})(st|nd|rd|th)(?=\\b)";
private static final Pattern PATTERN = Pattern.compile(SUPERSCRIPT_REGEX);
private static final float PROPORTION = 0.5f;
SuperscriptSpan superscript = new SuperscriptSpan();
RelativeSizeSpan size = new RelativeSizeSpan(PROPORTION);

private final SpannableStringBuilder stringBuilder;

public static OrdinalSuperscriptFormatter getInstance(SpannableStringBuilder stringBuilder){
    if (ordinalSuperscriptFormatter == null) {
        ordinalSuperscriptFormatter = new OrdinalSuperscriptFormatter(stringBuilder);
        return  ordinalSuperscriptFormatter;
    }
    else
        return  ordinalSuperscriptFormatter;
}

public static void refreshInstance(){
    ordinalSuperscriptFormatter = null;
}

private OrdinalSuperscriptFormatter(@NonNull SpannableStringBuilder stringBuilder) {
    this.stringBuilder = stringBuilder;
}

public void createSuperscriptSpan(int start, int end,TextView textView) {
    stringBuilder.setSpan(superscript, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    stringBuilder.setSpan(size, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    textView.setText(stringBuilder);
}

}

// refreshInstance будет вызывать, когда вы снова начинаете свою деятельность, или fragmnet для обновления списка

   override fun onResume() {
    super.onResume()
    OrdinalSuperscriptFormatter.refreshInstance() // must be referesh singleton instance for each history standings
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...