2012-11-27 8 views
19

Wer weiß, ob Android auf einem Platz mit null Breite funktionieren sollte, der als Zeilenumbruch funktioniert, wenn die TextView-Länge vom TextView überschritten wird? Es scheint, dass nur \ u0020 für mich Zeilenumbruch ist, aber ich bin nicht in der Lage, herauszufinden, wie man eine Null-Breitenversion davon hat. Das ist, was ich erwarte, sollte funktionieren, nach dem folgenden Link, aber es tut nur den Null-Breite-Raum und bricht nicht ... und wie gesagt, nur \ u0020 ist Zeilenumbruch.Zero-width line breaking space für Android

http://www.cs.tut.fi/~jkorpela/chars/spaces.html

Ich habe die Ansicht einer Aktivität angebracht ich für die Prüfung unter Verwendung von in dem U + anstelle von \ u verwendet wird.

Ich habe auch versucht mit der Option fromHtml, um zu sehen, ob es eine HTML-Option gibt, die funktioniert, aber noch kein Glück mit Arial hatte.

Hier ist der Test-Code Ich bin mit

public class TextSpaceActivity extends Activity { 

public static void start(Context ctx) { 
    ctx.startActivity( new Intent(ctx, TextSpaceActivity.class) ); 
} 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.text_space_activity); 
    setTitle("TextSpaceActivity"); 

    setText(R.id.tsa_txvw_1, "abc\u0020123\u0020xyz\u0020987"); 
    setText(R.id.tsa_txvw_2, "abc\u200a123\u200axyz\u200a987"); 
    setText(R.id.tsa_txvw_3, "abc\u200b123\u200bxyz\u200b987"); 
} 

TextView txvw; 
private void setText(int txvwResId, String txt) { 
    txvw = (TextView)findViewById(txvwResId); 
    txvw.setText(txt); 
} 
} 

enter image description here

+0

Können Sie diese System.getProperty verwenden ("line.separator") – Shark

+0

Haben Sie HTML mit ​ Unicode versucht? – Karan

+0

Vier Jahre später habe ich das gleiche Problem. Meine Android Version ist 6.0.1. Kann irgendjemand bestätigen, dass Android dies immer noch nicht unterstützt? –

Antwort

13

Ich glaube nicht, dass der Zeilentrennungsalgorithmus den Null-Breite-Zeilenumbruch oder weiche Bindestriche oder die Zeilen- oder Absatztrennzeichen für diese Angelegenheit versteht. Hier ist der Code aus der Android Quelle, wenn es entscheidet, hier ein Zeilenumbruch sein kann (android.text.StaticLayout, Linien 358-366 in der Quelle):

// From the Unicode Line Breaking Algorithm (at least approximately) 
boolean isLineBreak = isSpaceOrTab || 
     ///is class SY and - is class HY, except when followed by a digit 
     ((c == CHAR_SLASH || c == CHAR_HYPHEN) && 
     (j + 1 >= spanEnd || !Character.isDigit(chs[j + 1 - paraStart]))) || 
     // Ideographs are class ID: breakpoints when adjacent, except for NS 
     // (non-starters), which can be broken after but not before 
     (c >= CHAR_FIRST_CJK && isIdeographic(c, true) && 
     j + 1 < spanEnd && isIdeographic(chs[j + 1 - paraStart], false)); 

wo isSpaceOrTab definiert ist gerade oben (Linie 343) als:

Alle CHAR_ Konstanten sind einfache Zeichen Konstanten, also gibt es nichts wie isspace geht. 952-958 Linien in der gleichen Datei:

private static final char CHAR_FIRST_CJK = '\u2E80'; 

private static final char CHAR_NEW_LINE = '\n'; 
private static final char CHAR_TAB = '\t'; 
private static final char CHAR_SPACE = ' '; 
private static final char CHAR_SLASH = '/'; 
private static final char CHAR_HYPHEN = '-'; 

an Ihren anderen Kommentaren Sehen, ich sehe, Sie versuchen, Chinesisch richtig zu brechen. Sie müssen möglicherweise nichts Besonderes tun: wie der isIdeographic Aufruf oben Hinweise, es versucht, zwischen zwei Ideographen zu brechen, ohne Leerzeichen einzufügen. Nur der Breaker StaticLayout tut dies: DynamicLayout verwendet nur Newline-Zeichen, so wird es nur auf statischem Text korrekt brechen.

Ich habe Angst von meiner Forschung sieht es aus wie du bist geschraubt. Mein einziger Vorschlag für eine Umgehung wäre, eine WebView anstelle einer TextView zu verwenden, und die überlegenen Leitungsunterbrechungsfähigkeiten des Webbrowsers des Systems anstatt der begrenzten Implementierung TextView Angebote zu verwenden.

+0

Vielen Dank für Ihre Hilfe und Nachforschungen ... müssen herumspielen, um zu sehen, ob eine andere Lösung existiert, aber das WebView ist möglicherweise die einzige Wahl. Wahrscheinlich sollten Sie spezifische Textbeispiele zum Arbeiten bekommen, um zu sehen, wie sie sich verhalten und Entscheidungen von dort treffen. – mmaitlen

-1

Versuchen

textView.setText("abc" + System.getProperty("line.separator")+ " ..."); 

oder Kampf mit dem ellipsize() Parameter.

+3

Das Zeilentrennzeichen erzwingt die Unterbrechung der Zeile. Wir möchten nur, dass es einen Zeilenumbruch ausführt, wenn der Text die Breite der Textansicht zu lang ist. Da wir für den größten Satz von Telefonen entwerfen, können wir mit vielen verschiedenen Sprachen. Wir wollen (so viel wie möglich) kontrollieren können, wie lange die Produktbeschreibung angezeigt wird. Wir hofften, dass die Flexibilität geben würde, um den Text zu sagen, wenn Sie Zeilenumbrüche brauchen, brechen Sie hier, sonst zeigen Sie kein Leerzeichen. Dies ist speziell für chinesische Zeichensätze. – mmaitlen

-1

In Ihrem strings.xml:

<string name="sample_string"><![CDATA[abc123<br />xyz987]]></string> 

In Ihrer Aktivität:

TextView textView = (TextView) findViewById(R.id.myText); 
textView.setText(Html.fromHtml(getResources().getString(R.string.sample_string))); 

Hoffe, es hilft!

+1

Das erzwingt einen Zeilenumbruch, es bricht nicht nur, wenn die Zeile zu lang ist. –

-1

Wenn Sie nur die Präsentation in einem Browser steuern möchten, könnten Sie eine Null-Breite Inline-Klasse in CSS versuchen:

.zw { display: inline-block; width: 0; } 

Dann wird in der HTML:

abc<span class="zw"> </span>123 
+0

Die Frage bezieht sich auf eine Android-Aktivität, keine Webseite. –

3

Seit Lollipop , \u200b wird unterstützt.

Dies ist in StaticLayout mit einem nativen Anruf unter nLineBreakOpportunities implementiert.

+0

Wo finde ich die Quelle dieser nComputeLineBreaks? –

+2

Es funktioniert nicht für mich in Lollipop (5.1) – Oleksandr

+0

Ich benutze auch 5.1 und das Hinzufügen eines "\ u200b" zu Text, in diesem Fall in einem Alarm, behandelt es nicht automatisch als ein brechendes Leerzeichen. Vielleicht ist eine weitere Einstellung nötig? – ThomasW

0

Verwandte: Ich habe die Verwendung der Null-Breite Raum Zeichenentität &#8203; als Teil eines App Titel getestet, und es wird behandelt wie erwartet, wenn das Symbol der App auf dem Desktop durch das Android O gerendert wird.

<string name="app_name"> 
     App&#8203;Name&#8203;With&#8203;Many&#8203;Words 
    </string> 

Ich versuchte dies auf Android 5.0; unbekannt, ob es in älteren Versionen funktioniert.