Настройка многострочного TextView для Android

У меня есть Activity, где я хочу отобразить заголовок, который занимает верхнюю четверть приложения и отображает динамический набор текста. В некоторых случаях все это будет соответствовать одной строке, и я бы хотел, чтобы размер шрифта был увеличен, чтобы он был большим и легким для чтения. В некоторых случаях он будет на нескольких строках (обычно меньше 4) и должен быть меньше.

Усложнение состоит в том, что если я явно устанавливаю новые строки в setText, иногда он вставляет новую строку, где я не ожидал ее, т.е.

"My first line of text\nMy Second line of text"
Might get turned into (it right adjusted in this version):
"My first line of
             text
   My second line
          of text"

Я не уверен, как сделать так, чтобы TextView не пытался вставлять новые строки или позволял ему просто позаботиться о форматировании всего. Если я установил некоторый текст как одно длинное одно слово, он введет новую строку в середине в какой-то выбранной точке. И в других случаях я просто произвольно получаю последние несколько строк текста.

Должен ли я просто указать размер шрифта на самом деле очень маленьким, чтобы правильно его расставить, а затем вручную настроить размер? Есть ли "лучшая практика", которую я должен использовать для этого? Если я установил размер шрифта как достаточно крупный шрифт, он вроде бы работает, но было бы неплохо выяснить, что такое "правильный" способ сделать это. И я бы предпочел не добавлять вручную 4 однострочных TextViews и форматировать их самостоятельно.

Макет xml, который я использую, это:

<TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="10dip"
        android:layout_marginRight="8dip"
        android:singleLine="false"
        android:ellipsize="marque"
        android:gravity="right|bottom"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textSize="30sp"
/>

Ответ 1

Вы можете рассчитывать длину строки и задавать размер текста в соответствии с максимальным размером для каждой длины

что-то в этой форме

if(myString.length()==40){
    myTextview.setTextSize(11);
else if(myString.length()==25){
    myTextview.setTextSize(16);
...

Надеюсь, это поможет.

Ответ 2

Вы можете это сделать. Добавьте новый строковый charecter к строковому значению. Затем установите это строковое значение в качестве текстового атрибута TextView.

String temp = "ASDF \n"+"EFG \n"+"HIJ";
TextView tv=//find it from the context
tv.setText(temp);

Ответ 3

Есть еще одно решение, которое вы можете использовать WebView для выполнения того, что вы хотите, чтобы проверить этот текст Android TextView Justify для получения более подробной информации. используя webview, вам не нужно заботиться о выравниваниях строк, которыми вы можете управлять, используя свойство html css

Ответ 4

Позвольте мне повторить ваш вопрос, чтобы убедиться, что я правильно вас понял.

  • ваш вход всегда содержит от 1 до 4 строк текста
  • вы всегда и только хотите сломать в конце строки, если у вас более одной строки
  • вы хотите, чтобы каждая строка была максимально большой, чтобы она соответствовала текстовому виду, которое составляет 1/4 экрана высоты экрана.

Я предлагаю вам сделать пользовательский вид:

  • используйте Paint.getTextBounds, чтобы динамически определить максимальный размер текста в коде
  • для рисования текста вы можете использовать вспомогательный класс StaticLayout для управления выравниванием и т.д.
  • чтобы пользовательский вид занимал 1/4 экрана, либо помещал его в LinearLayout, и использовал layout_weight, чтобы назначить ему его высоту или установить его программно в View.onMeasure