Подтвердить что ты не робот

Автоматизация TextView не работает (Android O)

Я использую новую функцию автосохранения, добавленную в библиотеку поддержки 26. Я прочитал документацию, которую можно найти здесь: https://developer.android.com/preview/features/autosizing-textview.html

Я полагаю, что он должен работать следующим образом: вы можете включить автоматическое определение размера с помощью этого атрибута: app:autoSizeTextType="uniform". Я думаю, что TextView должен использовать все доступное пространство для отображения целого текста (а не только части - его нельзя обрезать), а textSize должен быть как можно большим. Если вам нужно ограничить максимальный или минимальный размер текста, вы можете использовать эти два атрибута:

app:autoSizeMinTextSize="XXsp" // (you can also use px or dp values.)

или

app:autoSizeMaxTextSize="XXsp"

Пока все хорошо. Скажем, мне нужен TextView с шириной 56dp. У меня есть тексты разной длины, и я хочу установить эти тексты на этот TextView. Он должен автоматически изменяться, поэтому он отображает весь текст (все символы + не обрезаны) в максимально возможной textSize.

Это мой TextView:

<android.support.v7.widget.AppCompatTextView
        android:id="@+id/vName"
        style="@style/TextView.AutoSize"
        android:layout_width="56dp"
        android:gravity="bottom|center_horizontal"
        android:maxLines="1"
        app:autoSizeMinTextSize="1px"
        app:autoSizeTextType="uniform"
        app:layout_constraintBottom_toTopOf="@id/vGuideline"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent" />

К сожалению, текстовое представление обрезано. Я хотел бы установить эту строку как текст в TextView выше: "Groupa", но это результат: введите описание изображения здесь

(TextView находится внутри ConstraintLayout с желтым фоном круга).

Как вы видите, текстовое изображение вообще не изменяется. Вы знаете, что делать?

Спасибо.

4b9b3361

Ответ 1

Я тестировал это для нескольких ситуаций и имел следующий вывод:

У вас должна быть ширина ширины и. Например, если вы установите ширину match_parent, но wrap_content для высоты, я думаю, что Android не знает, насколько высока вы хотите растянуть текст. В вашем примере у вас нет определенной высоты, поэтому я думаю, почему это не работает.

Например:

wrap content height for a text

specific height for a text

Я не знаю, почему официальный документ Android использовал бы пример wrap_content...

И как вы можете видеть, я не использовал другие атрибуты в моем примере, поэтому, вероятно, это не проблема с неправильными атрибутами.

И, да, TextView, который я использую, - это android.support.v7.widget.AppCompatTextView.

И пока вы используете библиотеку поддержки 26.0.0 или выше, она достаточно хороша.

EDIT:

Что касается ConstraintLayout, то принцип тот же. Вы должны иметь как ограниченную ширину, так и высоту, что означает либо один из ниже для каждого измерения:

  • Вы указали абсолютное значение для этого измерения (ширина или высота)

  • Вы установили ограничение в обоих направлениях

Например:

All 4 directions are constrainedHeight set to be an absolute valueWidth set to be an absolute value

ОБНОВЛЕНИЕ: (2017-09-21)

Я тестировал, что, к сожалению, похоже, что он еще не поддерживает пользовательский шрифт, который является функцией, опубликованной вместе в библиотеке поддержки v26...

Ответ 2

В дополнение к другим правильным ответам я обнаружил еще один момент, который не позволяет работать автонастройке.

Не используйте android:singleLine="true" вместе с авторазмером. Вместо этого используйте более новый android:maxLines="1".

Ответ 3

У меня была такая же проблема. Я решил это, изменив две строки в моем gradle: compile 'com.android.support:support-v4:26.0.1' и compile 'com.android.support:appcompat-v7:26.0.1' Чтобы добавить более длинные тексты, вы должны добавить все четыре параметра, например:

<android.support.v7.widget.AppCompatTextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/your_string"
        app:autoSizeTextType="uniform"
        app:autoSizeMaxTextSize="13sp"
        app:autoSizeMinTextSize="5sp"
        app:autoSizeStepGranularity="1sp"/>

Ответ 4

Какое значение вы задали для атрибута android: layout_height?

Из документа: " Если вы установите автоматизацию в файле XML, не рекомендуется использовать значение" wrap_content "для атрибутов layout_width или layout_height TextView. Это может привести к неожиданным результатам."

Ответ 5

Конфигурируйте свой TextView следующим образом

<TextView
    android:id="@+id/vName"
    android:layout_width="56dp"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:text="Groupa"
    app:autoSizeMinTextSize="12sp"
    app:autoSizeMaxTextSize="20sp"
    app:autoSizeTextType="uniform"
    />

Хорошо работать на Android 22, 23, 26
введите описание изображения здесь

Ответ 6

В моем случае проблема была очень глупой: хотя автоматическое изменение размера всегда работало для меня нормально, на одном TextView я использовал пространство имен android: вместо app: :! Я совершенно не замечал своей ошибки и продолжал задаваться вопросом, почему это не сработало. Поэтому при использовании темы AppCompat всегда обязательно используйте атрибуты AppCompat, а не нативные.

Ответ 7

Вы пытались установить все четыре атрибута, описанные в ссылке, которую вы опубликовали?

например.

app:autoSizeTextType="uniform"
app:autoSizeMaxTextSize="13sp"
app:autoSizeMinTextSize="5sp"
app:autoSizeStepGranularity="1sp"

Вы также можете попробовать установить ширину и высоту в wrap_content и установить minWidth и maxWidth на 56dp.

Как можно было бы также упомянуть в комментариях, maxlines создает проблемы (для меня также), поэтому попробуйте удалить это (возможно, автоматизация должна позаботиться об этом, уменьшив текст).

Ответ 8

если вы не знаете размер текстового поля. например вы помещаете их в linearlayout и устанавливаете высоту или ширину в 0dp. то я получил решение. вам нужно установитьAutoSizeTextTypeWithDefaults в событие OnSizeChanged.

@Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        this.setAutoSizeTextTypeWithDefaults(AUTO_SIZE_TEXT_TYPE_UNIFORM);

    }

Ответ 9

Используйте android:maxLines=1 как сказал @Henning.

<androidx.appcompat.widget.AppCompatTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textColor="@color/white"
            android:textSize="16sp"
            android:textStyle="bold"

            android:maxLines="1"
            app:autoSizeMaxTextSize="16sp"
            app:autoSizeMinTextSize="12sp"
            app:autoSizeTextType="uniform"

            tools:text="Downloading" />