Как авто размер textview динамически в соответствии с длиной текста в android?
Я беру данные переменных размеров с сервера и устанавливаю textView, и я хотел, чтобы textview изменял размер в соответствии с длиной текстового набора.
оно дается в материальных директивах дизайна. Как приступить к его кодированию ?
ссылка на руководство - https://material.google.com/style/typography.html#typography-other-typographic-guidelines
6 ответов
теперь есть официальное решение этой проблемы. Autosizing TextViews, представленные с Android O, доступны в библиотеке поддержки 26 и обратно совместимы вплоть до Android 4.0.
https://developer.android.com/preview/features/autosizing-textview.html
addTextChangedListener является слушателем для редактирования 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
может быть, вы можете попробовать что-то вроде этого:
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);
}
обновление : Вы можете обратиться к этому вопросу, если хотите решить свою проблему более android-способом. как установить размер текста textview динамически для разных экранов
Это то, что я использую для моего собственного кода. Любое предложение принимается для улучшения моего кода. Надеюсь, это поможет.
использовать под библиотеку, которая идеально подходит для ваших нужд.
согласно doc: TextView, который автоматически изменяет размер текста, чтобы идеально вписаться в его границы.
ссылки: Android autofit textview
редакция 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>
вот один из способов сделать это, используя библиотеку поддержки:
<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'