Как найти android TextView количество символов в строке?

Итак, у меня есть TextView в android, который имеет ширину всей длины экрана и заполнение dip 5. Как я могу рассчитать количество символов, которые будут соответствовать одной строке на экране? Другими словами, Я пытаюсь получить количество столбцов textview?

Я рассмотрел ручной расчет в зависимости от textsize и ширины, но 1) Не знаю корреляции и 2) из-за заполнения в единицах dip, разные экраны будут использовать разное количество фактические пиксели для заполнения.

общий вопрос: я пытаюсь использовать это для решения: если задана строка, как я могу вручную редактировать строку, чтобы, когда textview печатает символ строки по символу, я буду знать, когда начинать слово, которое не будет соответствовать одной строке на следующей. Примечание: Я знаю, что textview автоматически помещает слова, которые не будут вписываться в следующую строку, однако, поскольку я печатаю символ за символом, например, ввод анимации, textview не знает, что слово не будет соответствовать, пока оно печатает переполненные символы этого слова.

искал везде для этого...

спасибо!

решения:

одно из возможных решений:

public String measure2 (TextView t, String s) {
    String u = "";
    int start = 0;
    int end = 1;
    int space = 0;
    boolean ellipsized = false;
    float fwidth = t.getMeasuredWidth();
    for(;;) {
        //t.setText(s.substring(start, end));
        float twidth = t.getPaint().measureText(s.substring(start, end));
        if (twidth < fwidth){
            if (end < s.length())
                end++;
            else {
                if (!ellipsized)
                    return s;
                return u + s.subSequence(start, end);
            }
        }
        else {
            ellipsized = true;
            space = (u + s.substring(start, end)).lastIndexOf(" ");
            if (space == -1)
                space = end - 1;
            u += s.subSequence(start, space) + "n";
            start = space + 1;
            end = start + 1;
        }
    }
}

решение 2, но все же иногда использует Решение 1:

public String measure3 (TextView t, String s) {
    List<String> wlist = Arrays.asList(s.split(" "));
    if (wlist.size() == 1)
        return measure2(t, s);
    String u = "";
    int end = 1;
    float fwidth = t.getMeasuredWidth();
    for(;;) {
        //t.setText(s.substring(start, end));
        if (wlist.isEmpty())
            return u;
        String temp = listStr(wlist, end);
        float twidth = t.getPaint().measureText(temp);
        if (twidth < fwidth){
            if (end < wlist.size())
                end++;
            else {
                return u + temp;
            }
        }
        else {
            temp = listStr(wlist, end-1);
            if (end == 1)
                temp = measure2(t, temp);
            if (wlist.isEmpty())
                return u + temp;
            else
                u = u + temp + "n";
            wlist = wlist.subList(end - 1, wlist.size());
            end = 1;
        }
    }
}

public String listStr (List<String> arr, int end) {
    String s = "";
    for (String e : arr.subList(0, end) ){
        s = s + e + " ";
    }
    return s.trim();
}

я использовал приведенный выше код для генерации исходной строки s, строки u, которая будет напечатана. Однако я считаю, что такой подход очень неэффективен. Есть ли другой подход или лучше алгоритм? Примечание: есть некоторые ошибки в measure3, которые я исправил, но было слишком лениво редактировать

2 ответов


попробуйте это:

private boolean isTooLarge (TextView text, String newText) {
    float textWidth = text.getPaint().measureText(newText);
    return (textWidth >= text.getMeasuredWidth ());
}

обнаружение того, сколько символов подходит, будет невозможно из-за переменной ширины символов. Вышеуказанная функция проверит, будет ли конкретная строка соответствовать или нет в TextView. Содержание newText должно быть все символы в определенной строке. Если true, запустите новую строку (и используйте новую строку для передачи в качестве параметра).


ответ на комментарий:

  1. потому что приложение может запускаться во многих системах-это именно поэтому вам нужно измерить его.
  2. это способ решить ваш "общий вопрос". В чем разница между использованием НТР.размер ()>numCol против isTooLarge? Вам нужно будет реализовать вам анимацию (hint #1: insert a newline character)
  3. как я уже говорил, когда вы начинаете новую строку, вы начинаете новую строку (Подсказка №2: Если вы расширяете TextView, вы можете реализовать все это в переопределении setText). (Подсказка #3: Следите за строки, созданные с помощью static int lines; и использовать newString.split("\r?\n")[lines-1] для проверки длины).

вы можете получить общую строку Textview и получить строку для каждого символа с помощью кода ниже.Затем вы можете установить стиль для каждой строки, которую вы хотите.

Я выделил первую строку жирным шрифтом.

private void setLayoutListner( final TextView textView ) {
textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        textView.getViewTreeObserver().removeGlobalOnLayoutListener(this);

        final Layout layout = textView.getLayout();

        // Loop over all the lines and do whatever you need with
        // the width of the line
        for (int i = 0; i < layout.getLineCount(); i++) {
            int end = layout.getLineEnd(0);
            SpannableString content = new SpannableString( textView.getText().toString() );
            content.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, end, 0);
            content.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), end, content.length(), 0);
            textView.setText( content );
        }
    }
});

}

попробуйте этот способ.Вы можете применить несколько стилей таким образом.