Автоматизация 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 с желтым фоном круга).
Как вы видите, текстовое изображение вообще не изменяется. Вы знаете, что делать?
Спасибо.
Ответы
Ответ 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 constrained]()
![Height set to be an absolute value]()
![Width 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" />