Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to display dynamic text on a button and auto adjust their size in Android?

I'm working on a project which needs me to display some dynamic texts based on users' selection on a button.

I know how to do the text display part, but I was stuck on how I can display different text properly on a fixed size button.

For example: "Apple" and "I have an Apple". How can I achieve the result that when displaying "Apple", the text size will be bigger and fit the button, and when "I have an Apple" the text will be smaller and may become three lines?

Thank you!

like image 948
Arthur Wang Avatar asked Aug 20 '13 19:08

Arthur Wang


2 Answers

Style.xml:

    <style name="Widget.Button.CustomStyle" parent="Widget.MaterialComponents.Button">
        <item name="android:minHeight">50dp</item>
        <item name="android:maxWidth">300dp</item>
        <item name="android:textStyle">bold</item>
        <item name="android:textSize">16sp</item>
        <item name="backgroundTint">@color/white</item>
        <item name="cornerRadius">25dp</item>
        <item name="autoSizeTextType">uniform</item>
        <item name="autoSizeMinTextSize">10sp</item>
        <item name="autoSizeMaxTextSize">16sp</item>
        <item name="autoSizeStepGranularity">2sp</item>
        <item name="android:maxLines">1</item>
        <item name="android:textColor">@color/colorPrimary</item>
        <item name="android:insetTop">0dp</item>
        <item name="android:insetBottom">0dp</item>
        <item name="android:lineSpacingExtra">4sp</item>
        <item name="android:gravity">center</item>
    </style>

Usage:

<com.google.android.material.button.MaterialButton
            android:id="@+id/blah"
            style="@style/Widget.Button.CustomStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            android:text="Your long text, to the infinity and beyond!!! Why not :)" />

Result:
result

[Source: https://stackoverflow.com/a/59302886/421467 ]

like image 63
Dr.jacky Avatar answered Sep 21 '22 12:09

Dr.jacky


Android 8.0 supports Autosizing TextViews so you just have to specify android:autoSizeTextType="uniform". For older versions, you can use android.support.v7.widget.AppCompatTextView with app:autoSizeTextType="uniform".

By chance, it also works for buttons and for older versions just use android.support.v7.widget.AppCompatButton instead.

Hope this helped.

like image 42
Rostan Avatar answered Sep 20 '22 12:09

Rostan