Gibt es in Android eine Möglichkeit, die Textgröße in einer Textansicht an den Platz anzupassen, den sie einnimmt?
ZB verwende ich a TableLayout
und füge TextView
jeder Zeile mehrere s hinzu . Da ich nicht möchte, dass das TextView
s den Text umschließt, sehe ich eher, dass es die Schriftgröße des Inhalts verringert.
Irgendwelche Ideen?
Ich habe es versucht measureText
, aber da ich die Größe der Spalte nicht kenne, scheint es schwierig zu sein, sie zu verwenden. Dies ist der Code, in dem ich die Schriftgröße so ändern möchte, dass sie passt
TableRow row = new TableRow(this);
for (int i=0; i < ColumnNames.length; i++) {
TextView textColumn = new TextView(this);
textColumn.setText(ColumnNames[i]);
textColumn.setPadding(0, 0, 1, 0);
textColumn.setTextColor(getResources().getColor(R.drawable.text_default));
row.addView(textColumn, new TableRow.LayoutParams());
}
table.addView(row, new TableLayout.LayoutParams());
Antworten:
Die folgende Lösung enthält alle Vorschläge hier. Es beginnt mit dem, was ursprünglich von Dunni gepostet wurde. Es verwendet eine binäre Suche wie die von gjpc, ist aber etwas besser lesbar. Es enthält auch die Fehlerbehebungen von Gregm und eine eigene Fehlerbehebung.
quelle
<com.example.zengame1.FontFitTextView android:paddingTop="5dip" android:id="@+id/childs_name" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:layout_gravity="center" android:textSize="@dimen/text_size"/>
float hi = this.getHeight() - this.getPaddingBottom() - this.getPaddingTop();
Ich habe eine Klasse geschrieben, die TextView erweitert und dies tut. Es wird nur MeasureText verwendet, wie Sie vorschlagen. Grundsätzlich hat es eine maximale Textgröße und eine minimale Textgröße (die geändert werden kann) und durchläuft die Größen zwischen ihnen nur in Dekrementen von 1, bis die größte gefunden wird, die passt. Nicht besonders elegant, aber ich kenne keinen anderen Weg.
Hier ist der Code:
quelle
Dies ist Speedplane
FontFitTextView
, verringert jedoch nur bei Bedarf die Schriftgröße, um den Text anzupassen, und behält ansonsten die Schriftgröße bei. Die Schriftgröße wird nicht an die Höhe angepasst.Hier ist ein Beispiel, wie es in XML verwendet werden könnte:
Dies würde die Schriftgröße auf 60sp halten, solange der Text in die Breite passt. Wenn der Text länger ist, wird die Schriftgröße verringert. In diesem Fall
TextView
ändert sich auch die Höhe von s aufgrund vonheight=wrap_content
.Wenn Sie Fehler finden, können Sie diese jederzeit bearbeiten.
quelle
this.setMeasuredDimension(parentWidth, height);
match_parent
undwrap_content
.text.isEmpty()
wäre"".equals(text)
.Hier ist meine Lösung, die auf Emulator und Telefonen funktioniert, aber auf dem Eclipse-Layout-Editor nicht sehr gut funktioniert. Es ist vom Kilaka-Code inspiriert, aber die Größe des Textes wird nicht vom Paint erhalten, sondern vom Messen des TextView-Aufrufs
measure(0, 0)
.Die Java-Klasse:
Die XML-Attributdatei:
Überprüfen Sie meinen Github für die neueste Version dieser Klasse. Ich hoffe, es kann für jemanden nützlich sein. Wenn ein Fehler gefunden wird oder der Code erklärt werden muss, können Sie ein Problem mit Github eröffnen.
quelle
Vielen Dank an https://stackoverflow.com/users/234270/speedplane . Gute Antwort!
Hier ist eine verbesserte Version seiner Antwort, die sich auch um die Höhe kümmert und mit einem maxFontSize-Attribut zur Begrenzung der Schriftgröße geliefert wird (war in meinem Fall nützlich, daher wollte ich es teilen):
Entsprechende Datei /res/values/attr.xml:
Beispiel:
Um das neue
maxFontSize
Attribut zu verwenden, vergessen Sie nicht,xmlns:res-auto="http://schemas.android.com/apk/res-auto"
wie im Beispiel gezeigt hinzuzufügen .quelle
Ich hatte das gleiche Problem und schrieb eine Klasse, die für mich zu funktionieren scheint. Grundsätzlich habe ich ein statisches Layout verwendet, um den Text auf einer separaten Leinwand zu zeichnen und erneut zu messen, bis ich eine passende Schriftgröße gefunden habe. Sie können die Klasse im folgenden Thema sehen. Ich hoffe, es hilft.
Text automatisch skalieren Text anzeigen, um ihn an Grenzen anzupassen
quelle
Sie können dies jetzt ohne eine Drittanbieter-Bibliothek oder ein Widget tun. Es ist in APIV Level 26 in TextView integriert. Fügen
android:autoSizeTextType="uniform"
Sie es hinzuTextView
und legen Sie die Höhe fest. Das ist alles.https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html
Sie können auch
TextViewCompat
aus Kompatibilitätsgründen verwenden.quelle
Leichte Änderung an onMeasure:
Und binäre Suche auf refitText:
quelle
trySize *= availableWidth / measured_width
(dann auf minTextSize geklemmt).Ich fand, dass das Folgende gut für mich funktioniert. Es wird keine Schleife ausgeführt und berücksichtigt sowohl Höhe als auch Breite. Beachten Sie, dass es wichtig ist, die PX-Einheit anzugeben, wenn Sie setTextSize in der Ansicht aufrufen. Danke an den Tipp in einem vorherigen Beitrag dafür!
Hier ist die Routine, die ich verwende und die getPaint () aus der Ansicht übergibt. Eine 10-stellige Zeichenfolge mit einem "breiten" Zeichen wird verwendet, um die Breite unabhängig von der tatsächlichen Zeichenfolge zu schätzen.
quelle
Funktioniert mit Modifikation
Sie müssen die Größe der Textansicht folgendermaßen festlegen, da sonst setTextSize davon ausgeht, dass der Wert in SP-Einheiten angegeben ist:
Und Sie mussten diesen Code explizit hinzufügen.
quelle
Zur
app:autoSizeTextType="uniform"
Abwärtskompatibilität verwenden, daandroid:autoSizeTextType="uniform"
nur in API Level 26 und höher funktioniert.quelle
Ich habe oben eine Variation der Dunni-Lösung verwendet, aber dieser bestimmte Code hat bei mir nicht funktioniert. Insbesondere wenn Sie versuchen, das Paint-Objekt so zu verwenden, dass es die Merkmale des Paint-Objekts der Ansicht aufweist, und dann MeasureText () aufrufen, wird nicht derselbe Wert zurückgegeben wie beim direkten Aufrufen des Paint-Objekts der Ansicht. Vielleicht gibt es einige Unterschiede in der Art und Weise, wie meine Ansichten aufgebaut sind, die das Verhalten anders machen.
Meine Lösung bestand darin, die Farbe der Ansicht direkt zu verwenden, obwohl es einige Leistungseinbußen geben kann, wenn die Schriftgröße für die Ansicht mehrmals geändert wird.
quelle
Ich habe daran gearbeitet, die hervorragende Lösung von Speedplane zu verbessern, und mir das ausgedacht. Es verwaltet die Höhe, einschließlich der Einstellung des Randes, sodass der Text vertikal korrekt zentriert werden soll.
Dies verwendet dieselbe Funktion, um die Breite zu ermitteln, da dies am besten zu funktionieren scheint, verwendet jedoch eine andere Funktion, um die Höhe zu ermitteln, da die Höhe nirgendwo angegeben wird. Es müssen einige Korrekturen vorgenommen werden, aber ich habe einen Weg gefunden, dies zu tun, während ich für das Auge angenehm aussehe.
quelle
Google hat diese Funktion bereits erstellt.
https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html
quelle
Ich hatte diesen Schmerz in meinen Projekten soooo lange, bis ich diese Bibliothek fand:
Sie müssen nur die XML nach Ihren Wünschen hinzufügen und fertig. Beispielsweise:
quelle
Inspiriert von den vorherigen Postern wollte ich meine Lösung teilen. Es arbeitet mit einem Skalierungsfaktor, der auf die vorherige Schriftgröße angewendet wird, um ihn an den verfügbaren Platz anzupassen. Um ein unerwartetes Verhalten der TextViews onDraw-Methode zu verhindern, wird der Text einfach selbst gezeichnet.
quelle
quelle
Dies sollte eine einfache Lösung sein:
quelle
Erweitern Sie TextView und überschreiben Sie onDraw mit dem folgenden Code. Das Textseitenverhältnis wird beibehalten, aber die Größe angepasst, um den Raum auszufüllen. Sie können den Code bei Bedarf leicht ändern, um ihn zu dehnen.
quelle
Ich habe eine kurze Hilfsklasse geschrieben, die eine Textansicht in eine bestimmte Breite passt und am Ende die Ellipsengröße "..." hinzufügt, wenn die minimale Textgröße nicht erreicht werden kann.
Beachten Sie, dass der Text nur so lange verkleinert wird, bis er passt oder die minimale Textgröße erreicht ist. Stellen Sie zum Testen mit großen Größen die Textgröße auf eine große Zahl ein, bevor Sie die Hilfemethode aufrufen.
Es werden Pixel benötigt. Wenn Sie also Werte von dimen verwenden, können Sie dies folgendermaßen nennen:
Dies ist die Klasse, die ich benutze:
quelle
Wenn eine Transformation wie allCaps festgelegt ist, ist der Ansatz des Speedplane fehlerhaft. Ich habe es behoben, was zu folgendem Code führte (mein Ruf erlaubt mir leider nicht, dies als Kommentar zur Lösung von speedplane hinzuzufügen):
quelle
Ich weiß nicht, ob dies der richtige Weg ist oder nicht, aber es funktioniert ... Nehmen Sie Ihre Ansicht und überprüfen Sie OnGlobalLayoutListener () und erhalten Sie die Zeilenanzahl der Textansicht. Legen Sie dann textSize fest.
Es ist sehr einfach, ein paar Zeilencode ..
quelle