Absatzstil

Auf dieser Seite wird beschrieben, wie Sie Text für Ihren Absatz formatieren können. Um Formatierungen auf Absatzebene festzulegen, können Sie Parameter wie textAlign und lineHeight konfigurieren oder einen eigenen ParagraphStyle definieren.

Textausrichtung festlegen

Mit dem Parameter textAlign können Sie die horizontale Ausrichtung des Texts in einem zusammensetzbaren Text-Bereich festlegen.

Standardmäßig wird mit Text die natürliche Textausrichtung entsprechend dem Inhalt ausgewählt:

  • Linker Rand des Text-Containers für links-nach-rechts-Alphabete wie Lateinisch, Kyrillisch oder Hangul
  • Rechter Rand des Text-Containers für rechtsläufige Alphabete wie Arabisch oder Hebräisch

@Composable
fun CenterText() {
    Text(
        "Hello World", textAlign = TextAlign.Center, modifier = Modifier.width(150.dp)
    )
}

Der Text

Wenn Sie die Textausrichtung eines Text-Composable manuell festlegen möchten, verwenden Sie vorzugsweise TextAlign.Start und TextAlign.End anstelle von TextAlign.Left und TextAlign.Right, da sie je nach Textausrichtung der bevorzugten Sprache an den rechten Rand des Text-Composable angepasst werden. Beispiel: TextAlign.End wird bei französischem Text rechts und bei arabischem Text links ausgerichtet. TextAlign.Right wird unabhängig vom verwendeten Alphabet rechts ausgerichtet.

Mehrere Formatierungen in einem Absatz hinzufügen

Wenn Sie einem Absatz mehrere Formatierungen hinzufügen möchten, können Sie ParagraphStyle in einem AnnotatedString verwenden, das mit Formatierungen beliebiger Anmerkungen annotiert werden kann. Wenn ein Teil Ihres Textes mit einem ParagraphStyle markiert ist, wird dieser Teil vom restlichen Text getrennt, als ob er am Anfang und Ende Zeilenumbrüche hätte.

Weitere Informationen zum Hinzufügen mehrerer Formatierungen in einem Text finden Sie unter Mehrere Formatierungen in Text einfügen.

AnnotatedString hat einen typsicheren Builder, um die Erstellung von buildAnnotatedString zu vereinfachen. Im folgenden Snippet wird buildAnnotatedString verwendet, um ParagraphStyle festzulegen:

@Composable
fun ParagraphStyle() {
    Text(
        buildAnnotatedString {
            withStyle(style = ParagraphStyle(lineHeight = 30.sp)) {
                withStyle(style = SpanStyle(color = Color.Blue)) {
                    append("Hello\n")
                }
                withStyle(
                    style = SpanStyle(
                        fontWeight = FontWeight.Bold, color = Color.Red
                    )
                ) {
                    append("World\n")
                }
                append("Compose")
            }
        }
    )
}

Drei Absätze in drei verschiedenen Stilen: blau, rot und fett sowie schlicht schwarz

Zeilenhöhe und Innenabstand anpassen

includeFontPadding ist eine Legacy-Property, mit der basierend auf den Schriftartmesswerten zusätzliches Padding oben in der ersten Zeile und unten in der letzten Zeile eines Texts hinzugefügt wird. Ab der Compose-BOM-Version 2024.01.01 ist includeFontPadding standardmäßig auf false festgelegt. Dadurch wird das standardmäßige Textlayout besser an gängige Designtools angepasst.

Die Möglichkeit, lineHeight zu konfigurieren, ist nicht neu, sondern seit Android Q verfügbar. Sie können lineHeight für Text mit dem Parameter lineHeight konfigurieren, der die Zeilenhöhe in jeder Textzeile verteilt. Anschließend können Sie mit dem neuen LineHeightStyle API weiter konfigurieren, wie dieser Text im Bereich ausgerichtet wird, und Leerräume entfernen.

Sie können lineHeight mit der Texteinheit „em“ (relative Schriftgröße) anstelle von „sp“ (skalierte Pixel) anpassen, um die Genauigkeit zu verbessern. Weitere Informationen zum Auswählen einer geeigneten Texteinheit finden Sie unter TextUnit.

Bild, das die Zeilenhöhe als Maß basierend auf den Zeilen direkt darüber und darunter zeigt.
Abbildung 1. Verwenden Sie „Ausrichtung“ und „Zuschneiden“, um den Text innerhalb des festgelegten lineHeight anzupassen und bei Bedarf zusätzlichen Leerraum zu entfernen.

Text(
    text = text,
    style = LocalTextStyle.current.merge(
        TextStyle(
            lineHeight = 2.5.em,
            platformStyle = PlatformTextStyle(
                includeFontPadding = false
            ),
            lineHeightStyle = LineHeightStyle(
                alignment = LineHeightStyle.Alignment.Center,
                trim = LineHeightStyle.Trim.None
            )
        )
    )
)

Neben der Anpassung von lineHeight können Sie Text jetzt auch mithilfe von Konfigurationen mit der LineHeightStyle API zentrieren und formatieren: LineHeightStyle.Alignment und LineHeightStyle.Trim (includeFontPadding muss auf false festgelegt sein, damit die Funktion „Trim“ funktioniert). Bei der Ausrichtung und dem Zuschneiden wird der gemessene Abstand zwischen den Textzeilen verwendet, um den Text besser auf alle Zeilen zu verteilen, einschließlich einer einzelnen Textzeile und der obersten Zeile eines Textblocks.

LineHeightStyle.Alignment definiert, wie die Zeile im durch die Zeilenhöhe bereitgestellten Bereich ausgerichtet werden soll. In jeder Zeile können Sie den Text oben, unten, mittig oder proportional ausrichten. Mit LineHeightStyle.Trim können Sie den zusätzlichen Leerraum über der ersten und unter der letzten Zeile Ihres Textes, der durch lineHeight- und Ausrichtungsanpassungen generiert wurde, entfernen. Die folgenden Beispiele zeigen, wie mehrzeiliger Text mit verschiedenen LineHeightStyle.Trim-Konfigurationen aussieht, wenn die Ausrichtung zentriert (LineHeightStyle.Alignment.Center) ist.

Bild, das LineHeightStyle.Trim.None zeigt Bild, das LineHeightStyle.Trim.Both zeigt
LineHeightStyle.Trim.None LineHeightStyle.Trim.Both
Bild, das LineHeightStyle.Trim.FirstLineTop zeigt Ein Bild, das LineHeightStyle.Trim.LastLineBottom zeigt
LineHeightStyle.Trim.FirstLineTop LineHeightStyle.Trim.LastLineBottom

Weitere Informationen zum Kontext dieser Änderung, zur Funktionsweise von includeFontPadding im View-System und zu den Änderungen für Compose und die neuen LineHeightStyle-APIs finden Sie im Blogpost Fixing Font Padding in Compose Text.

Zeilenumbrüche einfügen

Die LineBreak API definiert die Kriterien, nach denen Text über mehrere Zeilen verteilt wird. Sie können den gewünschten Zeilenumbruch im TextStyle-Block Ihrer Text-Composable-Funktion angeben. Die voreingestellten Zeilenumbruchtypen umfassen Folgendes:

  • Simple – Schneller, einfacher Zeilenumbruch. Empfohlen für Texteingabefelder.
  • Heading: Zeilenumbruch mit weniger strengen Regeln. Empfohlen für kurzen Text wie Titel.
  • Paragraph: Langsamere, hochwertigere Zeilenumbrüche für eine bessere Lesbarkeit. Empfohlen für größere Textmengen wie Absätze.

Im folgenden Snippet werden sowohl Simple als auch Paragraph verwendet, um das Verhalten beim Zeilenumbruch für einen langen Textblock anzugeben:

TextSample(
    samples = mapOf(
        "Simple" to {
            Text(
                text = SAMPLE_LONG_TEXT,
                modifier = Modifier
                    .width(130.dp)
                    .border(BorderStroke(1.dp, Color.Gray)),
                fontSize = 14.sp,
                style = TextStyle.Default.copy(
                    lineBreak = LineBreak.Simple
                )
            )
        },
        "Paragraph" to {
            Text(
                text = SAMPLE_LONG_TEXT,
                modifier = Modifier
                    .width(130.dp)
                    .border(BorderStroke(1.dp, Color.Gray)),
                fontSize = 14.sp,
                style = TextStyle.Default.copy(
                    lineBreak = LineBreak.Paragraph
                )
            )
        }
    )
)

Ein Textblock mit einer einfachen Zeilenumbruchstrategie im Vergleich zu einem Textblock mit einer für Absätze optimierten Umbruchstrategie. Der Textblock mit der einfachen Strategie für Zeilenumbrüche weist eine größere Variabilität bei den Zeilenlängen auf.
Abbildung 1: Ein Textblock mit einer einfachen Strategie für den Zeilenumbruch (oben) im Vergleich zu einem Textblock mit einem für Absätze optimierten Zeilenumbruch (unten).

Im obigen Beispiel sehen Sie, dass das Zeilenumbruchverhalten von Paragraph ein optisch ausgewogeneres Ergebnis liefert als das von Simple.

Zeilenumbrüche anpassen

Sie können auch eine eigene LineBreak-Konfiguration mit dem Parameter Strategy erstellen. Strategy kann einer der folgenden Werte sein:

  • Balanced – Versucht, die Zeilenlängen des Texts auszugleichen, und wendet bei Bedarf auch die automatische Silbentrennung an. Empfohlen für kleine Displays wie Smartwatches, um die Menge des angezeigten Texts zu maximieren.
  • HighQuality: Optimiert einen Absatz für eine bessere Lesbarkeit, einschließlich der Silbentrennung, sofern aktiviert. (Sollte der Standardwert für alles sein, was nicht Balanced oder Simple ist.)
  • Simple – einfache, schnelle Strategie. Wenn diese Option aktiviert ist, wird die Silbentrennung nur für Wörter durchgeführt, die nicht in eine Zeile passen. Nützlich zum Bearbeiten von Text, um Positionsänderungen während des Tippens zu vermeiden.

Das folgende Snippet zeigt den Unterschied zwischen einem Absatz mit Standardeinstellungen und einem Absatz, der mit der Zeilenumbruchstrategie Balanced für kleine Bildschirme optimiert wurde:

TextSample(
    samples = mapOf(
        "Balanced" to {
            val smallScreenAdaptedParagraph =
                LineBreak.Paragraph.copy(strategy = LineBreak.Strategy.Balanced)
            Text(
                text = SAMPLE_LONG_TEXT,
                modifier = Modifier
                    .width(200.dp)
                    .border(BorderStroke(1.dp, Color.Gray)),
                fontSize = 14.sp,
                style = TextStyle.Default.copy(
                    lineBreak = smallScreenAdaptedParagraph
                )
            )
        },
        "Default" to {
            Text(
                text = SAMPLE_LONG_TEXT,
                modifier = Modifier
                    .width(200.dp)
                    .border(BorderStroke(1.dp, Color.Gray)),
                fontSize = 14.sp,
                style = TextStyle.Default
            )
        }
    )
)

Ein Absatz mit einer ausgewogenen Strategie für Zeilenumbrüche und ein Absatz ohne Strategie. Der Absatz mit der Strategie für ausgeglichenen Zeilenumbruch hat einheitlichere Zeilenlängen als der Standard.
Abbildung 2. Ein Absatz, der mit einer BalancedStrategie für Zeilenumbrüche
formatiert wurde (oben), im Vergleich zu einem Absatz, der ohne eine Strategie für Zeilenumbrüche formatiert wurde.

CJK-Überlegungen

Sie können LineBreak auch mit den APIs Strictness und WordBreak anpassen, die speziell für CJK-Sprachen entwickelt wurden. Die Auswirkungen dieser APIs sind in Sprachen, die nicht zum CJK-Sprachraum gehören, möglicherweise nicht immer sichtbar. Insgesamt werden die Regeln für Zeilenumbrüche basierend auf dem Gebietsschema definiert.

Strictness beschreibt die Strenge des Zeilenumbruchs mit den folgenden Attributen:

  • Default: Standardmäßige Zeilenumbruchregeln für das Gebietsschema. Kann Normal oder Strict entsprechen.
  • Loose: Die am wenigsten restriktiven Regeln. Geeignet für kurze Zeilen.
  • Normal: Die häufigsten Regeln für Zeilenumbrüche.
  • Strict: Die strengsten Regeln für Zeilenumbrüche.

Mit WordBreak wird festgelegt, wie Zeilenumbrüche in Wörtern eingefügt werden sollen. Dazu werden die folgenden Eigenschaften verwendet:

  • Default: Standardmäßige Zeilenumbruchregeln für das Gebietsschema.
  • Phrase: Der Zeilenumbruch basiert auf Formulierungen.

Im folgenden Snippet werden die Strenge Strict und die Einstellung für den Zeilenumbruch Phrase für einen japanischen Text verwendet:

val customTitleLineBreak = LineBreak(
    strategy = LineBreak.Strategy.HighQuality,
    strictness = LineBreak.Strictness.Strict,
    wordBreak = LineBreak.WordBreak.Phrase
)
Text(
    text = "あなたに寄り添う最先端のテクノロジー。",
    modifier = Modifier.width(250.dp),
    fontSize = 14.sp,
    style = TextStyle.Default.copy(
        lineBreak = customTitleLineBreak
    )
)

Japanischer Text mit den Einstellungen „Strenge“ und „WordBreak“ im Vergleich zum Standardtext.
Abbildung 3: Text, der mit den Einstellungen Strictness und WordBreak (oben) formatiert wurde, im Vergleich zu Text, der nur mit LineBreak.Heading (unten) formatiert wurde.

Über mehrere Zeilen verteilten Text trennen

Mit der Hyphens API können Sie Ihrer App Unterstützung für die Silbentrennung hinzufügen. Die Silbentrennung bezieht sich auf das Einfügen eines Bindestrichs, um anzugeben, dass ein Wort über mehrere Textzeilen verteilt ist. Wenn diese Option aktiviert ist, wird an geeigneten Trennstellen eine Silbentrennung zwischen den Silben eines Worts eingefügt.

Standardmäßig ist die Silbentrennung nicht aktiviert. Wenn Sie die Silbentrennung aktivieren möchten, fügen Sie Hyphens.Auto als Parameter in einen TextStyle-Block ein:

TextSample(
    samples = mapOf(
        "Hyphens - None" to {
            Text(
                text = SAMPLE_LONG_TEXT,
                modifier = Modifier
                    .width(130.dp)
                    .border(BorderStroke(1.dp, Color.Gray)),
                fontSize = 14.sp,
                style = TextStyle.Default.copy(
                    lineBreak = LineBreak.Paragraph,
                    hyphens = Hyphens.None
                )
            )
        },
        "Hyphens - Auto" to {
            Text(
                text = SAMPLE_LONG_TEXT,
                modifier = Modifier
                    .width(130.dp)
                    .border(BorderStroke(1.dp, Color.Gray)),
                fontSize = 14.sp,
                style = TextStyle.Default.copy(
                    lineBreak = LineBreak.Paragraph,
                    hyphens = Hyphens.Auto
                )
            )
        }
    )
)

Ein Absatz ohne aktivierte Silbentrennung und ein Absatz mit aktivierter Silbentrennung.
  Wenn die Silbentrennung aktiviert ist, wird ein Wort getrennt und auf zwei Zeilen aufgeteilt.
Abbildung 4: Ein Absatz ohne aktivierte Silbentrennung (oben) im Vergleich zu einem Absatz mit aktivierter Silbentrennung (unten).

Wenn die Silbentrennung aktiviert ist, wird sie nur unter den folgenden Bedingungen angewendet:

  • Ein Wort passt nicht in eine Zeile. Wenn Sie die Simple-Strategie für Zeilenumbrüche verwenden, wird ein Wort nur dann getrennt, wenn eine Zeile kürzer als das einzelne Wort ist.
  • Auf Ihrem Gerät ist das richtige Gebietsschema eingestellt, da die passende Silbentrennung anhand von Wörterbüchern im System bestimmt wird.