Как установить текстовый размер динамического текста для разных экранов

Я создаю текстовое представление и динамически добавляю его в макет. Я использую метод textView.setTextSize(18) для установки размера текста. Я протестировал его на планшете samsung и обнаружил, что размер шрифта слишком мал для этого экрана, тогда я изменил текст на 25, но он слишком большой для эмулятора (480 * 800). Моя задача - установить размер текста динамически, чтобы он соответствовал всем экранам.

Ответ 1

Вы должны использовать папки ресурсов, такие как

values-ldpi
values-mdpi
values-hdpi

И напишите размер текста в файле 'dimensions.xml' для каждого диапазона.

И в java-коде вы можете установить размер текста с помощью

textView.setTextSize(getResources().getDimension(R.dimen.textsize));

Примеры размеров .xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="textsize">15sp</dimen>
</resources>

Ответ 2

EDIT: И теперь, когда я ищу в StackOverflow, я нашел Этот вопрос повторяется: Этот и Это

Вам нужно использовать другую функцию setTextSize(unit, size) с единицей SP, как это,

tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f);

Подробнее читайте TypedValue.

Ответ 3

В этом случае, вероятно, нет необходимости использовать квалификаторы ldpi, mdpi или hdpi.

Когда вы определяете измерение в файле ресурсов, вы включаете блок измерения. Если вы используете sp-модули, они масштабируются в соответствии с плотностью экрана, поэтому текст на 15sp должен выглядеть примерно одинаковым по размеру на экранах различной плотности.
(Реальная плотность экрана устройства не будет точно соответствовать Android-обобщению плотность экрана в группы 120, 160, 240, 320, 480 and 640 dpi.)

При вызове getResources().getDimension(R.dimen.textsize) он вернет размер в пикселях. Если использовать sp, он будет масштабироваться по плотности экрана,

Вызов setText(float) устанавливает размер в sp units. Вот где проблема: i.e у вас есть измерения пикселей, с одной стороны, и sp unit с другой, чтобы исправить это:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
    getResources().getDimension(R.dimen.textsize));

Заметьте, вы также можете использовать

getResources().getDimensionPixelSize(R.dimen.textSize);

вместо getDimension(), и он будет округлен и преобразован в дробное значение.

Ответ 4

После долгого времени ударил это и, наконец, решил как это

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
              getResources().getDimension(R.dimen.textsize));

создать dimen папку, подобную этой res/values/dimensions.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

  <dimen name="textsize">8sp</dimen>

 </resources>

Ответ 5

В Style.xml предварительно определите стиль:

<style name="largeText">
    <item name="android:textAppearance">@android:style/TextAppearance.Large.Inverse</item>
    <item name="android:textStyle">bold</item>
</style>

в коде:

text.setTextAppearance(context, R.style.largeText);

Ответ 6

Я думаю, вам нужно использовать метод textView.setTextSize(float size), чтобы установить размер текста. textView.setText(arg), используемый для установки текста в текстовом представлении.

Ответ 7

float currentSize = textEdit.getTextSize(); // default size
float newSize = currentSize * 2.0F; // new size is twice bigger than default one
textEdit.setTextSize(newSize);