2012-11-27 22 views
19

Android'de, TextView uzunluğunun TextView metniyle aşılması durumunda, satır sonu olarak işlev gören sıfır genişlik alanı olarak Android'de çalışıp çalışmayacağını herkes biliyor mu? Görünüşe göre, sadece \ u0020 benim için bir satır kırıyor, ancak sıfır genişlikte bir sürümün nasıl bulunacağını anlayamıyorum. \ u200b, aşağıdaki bağlantıya göre çalışmamı beklediğim şeydir, ancak yalnızca sıfır genişlikli alanı yapar ve kesilmez ... ve belirtildiği gibi, yalnızca \ u0020 satır kesicidir.Android için sıfır genişlik çizgisi kesme alanı

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

Ben U + \ u yerine kullanılmakta olan test için ben kullanıyorum bir Faaliyet görünümü ekledim.

Ayrıca çalışan bir HTML seçeneği olup olmadığını görmek için fromHtml seçeneğini kullanmayı denedim, ancak arial ile hiç şansınız olmadı.

İşte

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

Bu System.getProperty ("line.separator") kullanıyor musunuz – Shark

+0

​ unicode ile HTML denediniz mi? – Karan

+0

Dört yıl sonra aynı problemim var. Android sürümüm 6.0.1. Android'in bunu desteklemediğini herkes doğrulayabilir mi? –

cevap

13

Çizgi kırma algoritmasının, sıfır genişlikli satır sonu veya yumuşak tire veya bu satırın satır veya paragraf ayırıcı karakterlerini anladığına inanmıyorum.

// 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)); 

isSpaceOrTab olarak hemen üstünde (hat 343) tanımlanır: Burada burada satır sonu olabilir eğer karar Android kaynağından kodu (android.text.StaticLayout, kaynağındaki hatları 358-366) bulunuyor

boolean isSpaceOrTab = c == CHAR_SPACE || c == CHAR_TAB; 

CHAR_ sabitlerinin tümü düz karakter sabitleridir, yani isspace devam ediyor gibi bir şey yoktur. Aynı dosyada Hatları 952-958:

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 = '-'; 

diğer yorumlarına bakınca, doğru Çin kırmaya çalışıyoruz görüyoruz. Özel bir şey yapmanız gerekmeyebilir: isIdeographic ipucunun yukarısında olduğu gibi, boşluk eklemeden iki ideograf arasında kopmaya çalışır. Sadece StaticLayout kesiciyi yapar: DynamicLayout sadece newline karakterleri kullanır, bu yüzden yalnızca statik metinlerde doğru şekilde kırılır.

Araştırmamdan korktum, vidalandınız gibi görünüyor. Benim bir çalışma etrafında benim önerim, bir TextView yerine bir WebView kullanmak ve sınırlı uygulama TextView teklifleri yerine sistemin web tarayıcısının üstün satır kesme yeteneklerini kullanmak olacaktır.

+0

Yardımlarınız ve araştırmalarınız için teşekkürler ... başka bir çözümün var olup olmadığını görmek için etrafta oynamak zorunda kalacaksınız, ancak WebView tek seçenek olabilir. Muhtemelen nasıl davrandığını ve oradan kararlar aldığını görmek için çalışmak için belirli metin örnekleri almalı. – mmaitlen

-1

etrafında ellipsize() parametresi ile

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

veya karışıklık deneyin kullanıyorum testi kod. senin strings.xml olarak

+3

Satır ayırıcısı çizginin kesilmesine zorlar, yalnızca metin görünümü genişliği için metin uzunsa bir satır sonu gerçekleştirmesini isteriz. En fazla sayıda telefon için tasarlandığımızdan, birçok farklı dil ile yapabiliriz. Ürün tanımının ne kadar uzun süre görüntüleneceğini (mümkün olduğunca) kontrol edebilmek istiyoruz. Biz burada u200b'nin metni söyleme esnekliğini vereceğini umuyoruz, eğer ara vermek gerekirse, burayı kırıyorsanız, aksi takdirde boşluk göstermeyin. Bu özellikle Çince karakter kümeleri içindir. – mmaitlen

-1

:

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

senin Bir Etkinlikte:

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

yardımcı olur Umut!

+1

Bu, bir satır kesmeye zorlar, yalnızca satır çok uzunsa kırılmaz. –

-1

yalnızca bir tarayıcıda sunum kontrol etmek istiyorsanız, CSS sıfır genişlikli satır içi sınıfını deneyebilirsiniz: HTML, Sonra

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

:

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

Soru bir Android etkinliği değil, bir web sayfasıdır. –

3

Lollipop yana \u200b desteklenmektedir.

Bu, nLineBreakOpportunities numaralı yerel arama ile StaticLayout'da uygulanır.

+0

Bu nComputeLineBreaks kaynağını nerede bulabilirim? –

+2

Lollipop (5.1) – Oleksandr

+0

'da benim için çalışmıyor 5.1 de kullanıyorum ve metne bir '\ u200b' ekleme, bu durumda bir uyarıda, otomatik olarak bir kırılma alanı olarak değerlendirilmez. Belki başka bir ayar gerekli? – ThomasW

0

İlgili: Ben sadece bir uygulama başlığı parçası olarak sıfır genişlikli boşluk karakteri varlık &#8203; kullanımını test ve uygulamanın simgesi Android OS tarafından masaüstünde işlendiğinde beklendiği gibi ele alınır.

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

Bunu Android 5.0'da denedim; Bununla birlikte, eski sürümlerde çalışıp çalışmayacağı bilinmemektedir.