475 Stimmen

Android TextView Text rechtfertigen

Wie erhält man den Text eines TextView im Blocksatz (mit Text bündig an den linken und rechten Seiten)?

Ich habe eine mögliche Lösung hier gefunden, aber es funktioniert nicht (selbst wenn man vertical-center in center_vertical ändert, usw).

0 Stimmen

@Jimbo Antwort ist definitiv korrekt und funktioniert für meinen Fall bei InputText und TextView für die arabische Sprache von rechts nach links für Eingabe und Anzeige. Aber für den Eingabetext musste ich auch `gravity="right"` hinzufügen.

0 Stimmen

0 Stimmen

45voto

Saeed Zarinfam Punkte 9384

Sie können das JustifiedTextView für Android Projekt auf Github verwenden. Dies ist eine benutzerdefinierte Ansicht, die justierten Text simuliert. Es unterstützt Android 2.0+ und Rechts-nach-Links-Sprachen. Geben Sie hier eine Bildbeschreibung ein

0 Stimmen

Es unterstützt keine skalierbaren Zeichenfolgen

0 Stimmen

Wie können wir eigenen Text hinzufügen?

0 Stimmen

Bitte siehe das Beispiel auf github.

30voto

Frank Cheng Punkte 5706

Ich schreibe ein Widget basierend auf dem nativen Textview, um dies zu tun.

github

0 Stimmen

Ich würde dieses hier empfehlen, hauptsächlich weil es auf dem Original-TextView aus dem offiziellen Android SDK basiert, was meiner persönlichen Meinung nach leichter ist als die Webview-Technik, über die viele Leute zu diesem Thema posten. Wenn Sie eine App erstellen, die speicher-schonend sein muss, z.B. indem Sie Listview-Objekte verwenden, sollten Sie vielleicht etwas Ähnliches in Betracht ziehen. Ich habe es bereits ausprobiert und es funktioniert wie erwartet. Wenn Sie ein besseres oder ähnliches kennen, teilen Sie bitte Ihre Erfahrungen mit mir.

0 Stimmen

Gute Arbeit übrigens. Was ich gesucht habe.

5 Stimmen

Unterstützt keine RTL-Sprachen wie Persisch

28voto

twiceYuan Punkte 854

Ich habe einen Weg gefunden, dieses Problem zu lösen, aber das ist möglicherweise nicht sehr elegant, aber die Wirkung ist nicht schlecht.

Das Prinzip besteht darin, die Leerzeichen jeder Zeile durch das ImageSpan mit fester Breite (die Farbe ist transparent) zu ersetzen.

public static void justify(final TextView textView) {

    final AtomicBoolean isJustify = new AtomicBoolean(false);

    final String textString = textView.getText().toString();

    final TextPaint textPaint = textView.getPaint();

    final SpannableStringBuilder builder = new SpannableStringBuilder();

    textView.post(new Runnable() {
        @Override
        public void run() {

            if (!isJustify.get()) {

                final int lineCount = textView.getLineCount();
                final int textViewWidth = textView.getWidth();

                for (int i = 0; i < lineCount; i++) {

                    int lineStart = textView.getLayout().getLineStart(i);
                    int lineEnd = textView.getLayout().getLineEnd(i);

                    String lineString = textString.substring(lineStart, lineEnd);

                    if (i == lineCount - 1) {
                        builder.append(new SpannableString(lineString));
                        break;
                    }

                    String trimSpaceText = lineString.trim();
                    String removeSpaceText = lineString.replaceAll(" ", "");

                    float removeSpaceWidth = textPaint.measureText(removeSpaceText);
                    float spaceCount = trimSpaceText.length() - removeSpaceText.length();

                    float eachSpaceWidth = (textViewWidth - removeSpaceWidth) / spaceCount;

                    SpannableString spannableString = new SpannableString(lineString);
                    for (int j = 0; j < trimSpaceText.length(); j++) {
                        char c = trimSpaceText.charAt(j);
                        if (c == ' ') {
                            Drawable drawable = new ColorDrawable(0x00ffffff);
                            drawable.setBounds(0, 0, (int) eachSpaceWidth, 0);
                            ImageSpan span = new ImageSpan(drawable);
                            spannableString.setSpan(span, j, j + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                        }
                    }

                    builder.append(spannableString);
                }

                textView.setText(builder);
                isJustify.set(true);
            }
        }
    });
}

Ich habe den Code auf GitHub platziert: https://github.com/twiceyuan/TextJustification

Übersicht:

Übersicht

3 Stimmen

Funktioniert nicht in der XML-Vorschau, funktioniert jedoch einwandfrei mit einem echten Gerät :)

1 Stimmen

Nur funktioniert, wenn der TextView leider keine Formatierung enthält.

0 Stimmen

Funktioniert gut in Android 11, mit Kotlin.

18voto

Sehr einfach Das können wir in der XML-Datei machen

5 Stimmen

Dies erfordert API-Level 26. Wie könnte ich Unterstützung für niedrigere Level bieten?

17voto

XML-Layout: deklarieren Sie WebView anstelle von TextView

Java-Code: setze Textdaten in WebView

WebView view = (WebView) findViewById(R.id.textContent);
String text;
text = "";
text+= "Dies ist der Text, der beim Anzeigen justiert wird!!!";
text+= "";
view.loadData(text, "text/html", "utf-8");

Dies könnte Ihr Problem lösen. Es hat bei mir vollständig funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X