Ik gebruik de nieuwe functie voor automatisch aanpassen die is toegevoegd in ondersteuningsbibliotheek 26. Ik lees een documentatie die hier te vinden is:
https://developer.android.com/preview/features/autosizing-textview.html
Ik veronderstel dat het op deze manier zou moeten werken: je kunt automatische grootte inschakelen met dit kenmerk: app:autoSizeTextType="uniform"
. Ik denk dat TextView
alle beschikbare ruimte moet gebruiken om een hele tekst weer te geven (niet alleen een deel – het mag niet worden bijgesneden) en de textSize
moet zo groot mogelijk zijn . Als u een maximum- of minimumgrootte van de tekst moet beperken, kunt u deze twee kenmerken gebruiken:
app:autoSizeMinTextSize="XXsp" // (you can also use px or dp values.)
of
app:autoSizeMaxTextSize="XXsp"
Tot nu toe gaat het goed. Laten we zeggen dat ik een TextView nodig heb met een breedte van 56 dp. Ik heb teksten met een andere lengte en ik wil deze teksten op deze TextView
zetten. De grootte zou automatisch moeten worden aangepast, zodat de hele tekst (alle tekens + niet bijgesneden) wordt weergegeven in de grootst mogelijke textSize
.
Dit is mijn 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" />
Helaas is de tekstweergave bijgesneden. Ik wilde deze String instellen als een tekst naar de TextView hierboven: “Groupa” maar dit is het resultaat:
(TextView bevindt zich binnen ConstraintLayout met gele cirkel als achtergrond.)
Zoals je kunt zien is de tekstweergave helemaal niet aangepast. Heb je enig idee wat je moet doen?
Bedankt.
Antwoord 1, autoriteit 100%
Aanvullend op de andere juiste antwoorden heb ik nog een punt gevonden waardoor autosizing niet werkt.
Gebruik android:singleLine="true"
niet samen met autosizing. Gebruik in plaats daarvan de nieuwere android:maxLines="1"
.
Antwoord 2, autoriteit 96%
Ik heb dit voor een paar situaties getest en kom tot de onderstaande conclusie:
Je moet begrensde breedte enhoogte hebben. Als je bijvoorbeeld de breedte instelt op match_parent
maar wrap_content
voor de hoogte, denk ik dat Android niet weet hoe hoog je je tekst wilt uitrekken. In jouw voorbeeld heb je geen specifieke lengte, dus ik denk dat het daarom niet werkt.
Bijvoorbeeld:
Ik weet niet waarom het officiële Android-document wrap_content als voorbeeld zou gebruiken…
En zoals je kunt zien heb ik in mijn voorbeeld geen andere attributen gebruikt, dus het is waarschijnlijk niet het probleem van onjuiste attributen.
En ja, de TextView die ik gebruik is android.support.v7.widget.AppCompatTextView.
En zolang je ondersteuningsbibliotheek 26.0.0 of hoger gebruikt, is het goed genoeg.
BEWERKEN:
Voor ConstraintLayout
geldt hetzelfde principe.
U moet zowel een begrensde breedte als hoogte hebben, wat een van de onderstaande betekent voor elke dimensie:
-
U heeft een absolute waarde opgegeven voor die dimensie (breedte of hoogte)
-
U heeft de beperking in beide richtingen ingesteld
Bijvoorbeeld:
UPDATE: (21-09-2017)
Ik heb getest dat het helaas lijkt alsof het nog geen aangepast lettertype ondersteunt, wat een functie is die samen is gepubliceerd in ondersteuningsbibliotheek v26…
Antwoord 3, autoriteit 18%
Ik had hetzelfde probleem.
Ik heb het opgelost door twee regels in mijn gradle te veranderen:
compile 'com.android.support:support-v4:26.0.1'
en
compile 'com.android.support:appcompat-v7:26.0.1'
Om langere teksten te laten passen, moet je alle vier de opties toevoegen, zoals deze:
<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"/>
Antwoord 4, autoriteit 16%
Welke waarde heb je ingesteld op android:layout_height attribuut?
Van het document: “Als u automatische grootte instelt in een XML-bestand, wordt het niet aanbevolen om de waarde “wrap_content” te gebruiken voor de attributen layout_width of layout_height van een TextView. Dit kan onverwachte resultaten opleveren.>”
Ik heb ook een tutorial gemaakt over Het automatisch aanpassen van TextView hier.
Antwoord 5, autoriteit 11%
In mijn geval was er iets heel stoms aan de hand: hoewel autosizing altijd goed werkte voor mij, gebruikte ik op precies één TextView de android:
namespace in plaats van app:
! Ik was me totaal niet bewust van mijn fout en bleef me afvragen waarom het niet werkte. Dus als u een AppCompat
-thema gebruikt, zorg er dan altijd voor dat u de AppCompat
-kenmerken gebruikt, niet de oorspronkelijke.
Antwoord 6, autoriteit 11%
Aanvullende informatie bij het geaccepteerde antwoord van @Sira Lam:
Zorg er altijd voor dat u geen kenmerken overneemt die het gedrag van AutoTextSize kunnen conflicteren, met name android:singleLine
.
Hoewel android:maxLines
of android:lines
nietde TextView
belemmeren om de juiste grootte te singleLine
-kenmerk (indien ingesteld op true) schakelt automatisch formaat uit.
Dus probeer bij het opsporen van een AutoTextSize-probleem eerst te zoeken naar het kenmerk singleLine
, omdat het soms wordt overgenomen bij het uitbreiden van Button
.
Antwoord 7, autoriteit 7%
Zorg ervoor dat u deze opties aanvinkt om autoSizete laten werken:
- Gebruik
wrap_content
in geen enkele dimensie (zoalslayout_width
enlayout_height
) - Zorg ervoor dat u geen
singleLine
gebruikt, maarandroid:maxLines
- Gebruik
app:autosizexxx
in plaats vanandroid:autosizexxx
om oudere Android-versies te ondersteunen - Automatisch formaat werkt in zowel
AppCompatTextView
alsTextView
, dus u hoeft uw weergave niet te wijzigen
Antwoord 8, autoriteit 5%
Heb je geprobeerd alle vier de kenmerken in te stellen die worden beschreven in de link die je hebt gepost?
Bijvoorbeeld
app:autoSizeTextType="uniform"
app:autoSizeMaxTextSize="13sp"
app:autoSizeMinTextSize="5sp"
app:autoSizeStepGranularity="1sp"
Je kunt ook proberen om zowel de breedte als de hoogte in te stellen op wrap_content, en minWidth en maxWidth in te stellen op 56dp.
Zoals mogelijk ook vermeld in de opmerkingen, lijkt maxlines problemen te veroorzaken (voor mij ook), dus probeer dat te verwijderen (de automatische grootte zou dit waarschijnlijk moeten oplossen, door de tekstgrootte te verkleinen).