How To Auto Size Textview Dynamically According To The Length Of The Text In Android?
Solution 1:
There's now an official solution to this problem. Autosizing TextViews introduced with Android O are available in the Support Library 26 and is backwards compatible all the way down to Android 4.0.
https://developer.android.com/preview/features/autosizing-textview.html
Solution 2:
Here's one way to do it, using the support library:
<androidx.appcompat.widget.AppCompatTextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:breakStrategy="balanced"android:gravity="center_horizontal"android:maxLines="1"android:text="Hello world"android:textSize="300sp"app:autoSizeTextType="uniform"tools:targetApi="o"/>
The android:breakStrategy
allows making the text go to the next line nicely, instead of the default behavior which might break the words.
In gradle, use this:
implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
implementation 'com.google.android.material:material:1.0.0-beta01'
Or this:
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
Note that it's recommended to set layout restrictions on the TextView (width and/or height), to make sure you will get it right. All depends on your use case.
Solution 3:
Revision 26.0.1 of Support Library added support for autosizing in AppCompatTextView.
Developers can now let the size of their text expand or contract automatically based on the size and characteristics of the TextView, making it much easier to optimize the text size on different screens or with dynamic content.
Granularity
In Java:
Call the setAutoSizeTextTypeUniformWithConfiguration()
method:
setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit)
In XML:
Use the autoSizeMinTextSize, autoSizeMaxTextSize, and autoSizeStepGranularity attributes to set the auto-sizing dimensions in the layout XML file:
<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" />
Preset Sizes
In Java:
Call the setAutoSizeTextTypeUniformWithPresetSizes()
method:
setAutoSizeTextTypeUniformWithPresetSizes(int[] presetSizes, int unit)
In XML:
Use the autoSizePresetSizes attribute in the layout XML file:
<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" />
To access the array as a resource, define the array in the res/values/arrays.xml file:
<arrayname="autosize_text_sizes"><item>10sp</item><item>12sp</item><item>20sp</item><item>40sp</item><item>100sp</item></array>
Solution 4:
addTextChangedListener is a listener for Edit Tex. this listener watch the changes of editText and it has three different states.
EditTextedt= someEditText;
edt.addTextChangedListener(newTextWatcher() {
@OverridepublicvoidbeforeTextChanged(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*/@OverridepublicvoidonTextChanged(CharSequence s, int start, int before, int count) {
if (edt.getText().toString().length() > 10){
edt.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSizeSmall);
}
elseif (edt.getText().toString().length() > 5){
edt.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSizeMedium);
}
}
@OverridepublicvoidafterTextChanged(Editable s) {
}
});
Updated: According to question you can create a component(custom view) and extend it from AppCompatTextView name as you want; in its initialization you can add below code:
publicclassCustomTextViewextendsAppCompatTextView {
Context ctx;
publicCustomTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
ctx = context;
init();
}
publicCustomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
ctx = context;
init();
}
publicCustomTextView(Context context) {
super(context);
ctx = context;
init();
}
publicvoidinit() {
setOnTouchListener(null);
addTextChangedListener(newTextWatcher() {
@OverridepublicvoidbeforeTextChanged(CharSequence s, int start, int count, int after) {
}
@OverridepublicvoidonTextChanged(CharSequence s, int start, int before, int count) {
if (getText().toString().length() > 10){
setTextSize(TypedValue.COMPLEX_UNIT_SP, textSizeSmall);
}
elseif (getText().toString().length() > 5){
setTextSize(TypedValue.COMPLEX_UNIT_SP, textSizeMedium);
}
}
@OverridepublicvoidafterTextChanged(Editable s) {
}
});
}
}
you must use it in xml instead of the usual textView
Solution 5:
Maybe you can try something like this:
EditText et = someEditText;
String text = et.getText().toString();
int textLength = text.length();
if (textLength > 25) {
et.setTextSize(toSomeNumber as the size of the text);
} elseif (textLength > 15) {
et.setTextSize(toSomeNumber bigger than the previous);
} else {
et.setTextSize(toSomeNumber thisis the biggest);
}
UPDATE : You can refer to this question if you want to solve your problem in more android way. How to set text size of textview dynamically for different screens
This is what I use for my own codes. Any suggestion is accepted to enhance my code. Hope it helps.
Post a Comment for "How To Auto Size Textview Dynamically According To The Length Of The Text In Android?"