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).
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).
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.
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.
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:
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 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.
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
Sie können github.com/pouriaHemmati/JustifiedTextView verwenden
0 Stimmen
github.com/amilcar-sr/JustifiedTextView kann verwendet werden