Как автоматически настроить текстовое представление динамически в соответствии с длиной текста в android?

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

Он приведен в руководствах по разработке материалов. Как это сделать?

Material Design Guidelines

ссылка на Руководство - https://material.google.com/style/typography.html#typography-other-typographic-guidelines

Ответ 1

Там сейчас официальное решение этой проблемы. Авторазмер TextViews, представленный в Android O, доступен в библиотеке поддержки 26 и обратно совместим вплоть до Android 4.0.

https://developer.android.com/preview/features/autosizing-textview.html

Ответ 2

addTextChangedListener - это слушатель для Edit Tex. этот слушатель наблюдает за изменениями editText и имеет три разных состояния.

EditText edt = someEditText;
edt.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        /*watch the editText on every input and changes, then mange the size by if statements and editText length*/
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (edt.getText().toString().length() > 10){
                edt.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSizeSmall);
            }
            else if (edt.getText().toString().length() > 5){
                edt.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSizeMedium);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });

Обновлено: В соответствии с вопросом вы можете создать компонент (пользовательский вид) и продлить его из имени AppCompatTextView по своему желанию; в его инициализации вы можете добавить код ниже:

public class CustomTextView extends AppCompatTextView {
Context ctx;

public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    ctx = context;
    init();
}

public CustomTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    ctx = context;
    init();
}

public CustomTextView(Context context) {
    super(context);
    ctx = context;
    init();
}

public void init() {
    setOnTouchListener(null);
    addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (getText().toString().length() > 10){
                setTextSize(TypedValue.COMPLEX_UNIT_SP, textSizeSmall);
            }
            else if (getText().toString().length() > 5){
                setTextSize(TypedValue.COMPLEX_UNIT_SP, textSizeMedium);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
}

}

вы должны использовать его в xml вместо обычного textView

Ответ 3

Возможно, вы можете попробовать что-то вроде этого:

EditText et = someEditText;
String text = et.getText().toString();
int textLength = text.length();

if (textLength > 25) {
    et.setTextSize(toSomeNumber as the size of the text);
} else if (textLength > 15) {
     et.setTextSize(toSomeNumber bigger than the previous);
} else {
      et.setTextSize(toSomeNumber this is the biggest);
}

ОБНОВЛЕНИЕ: Вы можете обратиться к этому вопросу, если хотите решить свою проблему по-другому. Как установить текстовый размер динамически для разных экранов

Это то, что я использую для своих собственных кодов. Любые предложения принимаются для улучшения моего кода. Надеюсь, что это поможет.

Ответ 4

Вот один из способов сделать это, используя библиотеку поддержки:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:autoSizeTextType="uniform"
        android:breakStrategy="balanced" 
        android:gravity="center_horizontal"
        android:maxLines="1"
        android:text="Hello world" 
        android:textSize="300sp" 
        app:autoSizeTextType="uniform"
        tools:targetApi="o"/>

android:breakStrategy позволяет заставить текст хорошо переходить на следующую строку вместо поведения по умолчанию, которое может разбить слова.

В Gradle используйте это:

implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
implementation 'com.google.android.material:material:1.0.0-beta01'

Или это:

implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'

Обратите внимание, что рекомендуется установить ограничения макета для TextView (ширина и/или высота), чтобы убедиться, что вы все сделаете правильно. Все зависит от вашего варианта использования.

Ответ 5

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

В соответствии с документом: TextView, который автоматически изменяет размер текста в соответствии с его границами.

Ссылка: Android autofit textview

Ответ 6

В редакции 26.0.1 в Библиотеке поддержки добавлена ​​поддержка автосохранения в AppCompatTextView.

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

Зернистость

В Java:

Вызвать метод setAutoSizeTextTypeUniformWithConfiguration():

setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit)

В XML:

Используйте атрибуты autoSizeMinTextSize, autoSizeMaxTextSize и autoSizeStepGranularity для установки параметров автоматического калибровки в XML файле макета:

<android.support.v7.widget.AppCompatTextView
        android:id="@+id/autosizing_textview_presetsize" 
        android:layout_width="wrap_content" 
        android:layout_height="250dp" 
        android:layout_marginLeft="0dp" 
        android:layout_marginTop="0dp" 
        app:autoSizeMaxTextSize="100sp" 
        app:autoSizeMinTextSize="12sp" 
        app:autoSizeStepGranularity="2sp" 
        app:autoSizeText="uniform" 
        android:text="Hello World!" 
        android:textSize="100sp" 
        app:layout_constraintLeft_toLeftOf="parent" 
        app:layout_constraintTop_toTopOf="parent" />

Предустановленные размеры

В Java:

Вызвать метод setAutoSizeTextTypeUniformWithPresetSizes():

setAutoSizeTextTypeUniformWithPresetSizes(int[] presetSizes, int unit)

В XML:

Используйте атрибут autoSizePresetSizes в XML файле макета:

<android.support.v7.widget.AppCompatTextView 
        android:id="@+id/autosizing_textview_presetsize" 
        android:layout_width="wrap_content" 
        android:layout_height="250dp" 
        android:layout_marginLeft="0dp" 
        android:layout_marginTop="0dp" 
        app:autoSizeText="uniform" 
        app:autoSizePresetSizes="@array/autosize_text_sizes" 
        android:text="Hello World!" 
        android:textSize="100sp" 
        app:layout_constraintLeft_toLeftOf="parent" 
        app:layout_constraintTop_toTopOf="parent" />

Чтобы получить доступ к массиву в качестве ресурса, определите массив в файле res/values ​​/arrays.xml:

<array name="autosize_text_sizes">
    <item>10sp</item>
    <item>12sp</item>
    <item>20sp</item>
    <item>40sp</item>
    <item>100sp</item>
</array>