Размер шрифта TextView по размеру экрана

148
26 октября 2018, 02:50

Есть текст. Уже с разметкой. Задача: отобразить его в TextView в соответствии с разметкой, без дополнительных переносов. Идея: сделать это за счёт подбора размера шрифта перед отображением на дисплее. Реализация: Устанавливаем шрифт

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,mTextSize(TEXT));

Измеряем некую TextView с текстом, который хотим отобразить. Размер шрифта произвольный. TextView не имеет ограничений и должна принять размеры в зависимости от текста( а может и нет?). Также измеряем дисплей и по пропорции вычисляем необходимый нам размер шрифта. Такой, чтобы текст отобразился на нашем экране без ограничений и лишних переносов.

private float mTextSize(String mText){
        TextView mTextView = new TextView(this);
        mTextView.setText(mText);
        mTextView.setTextSize( TypedValue.COMPLEX_UNIT_PX,111);
        mTextView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        int mWidth = mTextView.getMeasuredWidth();
        float textSize = (getDisplayWidth()*111)/mWidth;            
        return  textSize;
    }

Метод. Ширина дисплея устройства

private int getDisplayWidth (){
    Display display = getWindowManager().getDefaultDisplay();
    Point point = new Point();
    display.getSize(point);
    int width = point.x;
    return width;
}

В итоге рассчитывается размер шрифта. Но такой, как будто этого и не происходило. Т.е. размер рассчитывается ровно такой, какой он по умолчанию без расчётов определяется TextView. Соответственно текст отображается с лишними переносами. Мне же надо, что бы какой бы длинной не была самая длинная строка, она должна влезть в экран целиком, пусть даже шрифт будет минимальным. Думаю что проблема связана с тем, что TextView при создании получает context, поэтому не является оторванной от устройства. Как можно это исправить?Что не так в моём подходе? Какими подходами пользуйтесь вы?

Answer 1

В support-библиотеке андроида есть готовое решение для этого. Просто нужно использовать AppCompatTextView с необходимыми атрибутами:

<android.support.v7.widget.AppCompatTextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:maxLines="1"
    android:text="Hello World!"
    app:autoSizeMaxTextSize="100sp"
    app:autoSizeMinTextSize="12sp"
    app:autoSizeTextType="uniform" />

Во-первых, для включения функции нужно указать атрибут autoSizeTextType, а также задать минимальный и максимальный размер шрифта. Если хотите запретить переносы, то укажите maxLines=1.

Обратите внимание, что используется AppCompatTextView, а не просто TextView.

Кроме того, проверьте, что у вас в build.gradle есть зависимость на com.android.support:appcompat-v7.

Больше примеров в гайде Autosizing TextViews

READ ALSO
Нажание на Row в TableView

Нажание на Row в TableView

По умолчанию в TableView нажатие на строки происходит с помощью 2-х клавиш мыши - левой и правойКак можно реализовать нажатие на строку исключительно...

165
Возможно ли запретить создание лямбды

Возможно ли запретить создание лямбды

В проекте имеется обычный интерфейс с единственным методОн был создан еще на Java 5 и стал за это время довольно популярным

164
Парсер на Java для строк

Парсер на Java для строк

Подскажите парсер для строк, написанный на Java

176
getBytes() и русские символы - Java

getBytes() и русские символы - Java

Столкнулся с проблемой в примере из книги Шилда :

155