Android e & nbsp; em TextView

108

é possível adicionar  em TextView? Alguém alcançou uma funcionalidade semelhante?

Eu quero ter um espaço inquebrável em TextView.

Mikooos
fonte

Respostas:

184

TextViewrespeita o caractere de espaço sem quebra Unicode ( \u00A0), que seria uma solução mais simples / leve do que HTML.

Dan Dyer
fonte
3
Isso funciona muito bem. Você pode adicionar isso ao xml ou em código java. Funciona bem em código java, em xml não testei muito, mas deve funcionar.
Mikooos
Nem \ u0020 nem \ u00A0 funcionam. Nem configurando-os em XML (nem mesmo na visualização em XML) nem configurando-os em Java com setText (). Tentei ambos com Android 4.1 e 4.2
Stephan Wiesner
1
Isso não funciona em conjunto com a vírgula. Nesses casos, você obtém uma quebra de linha logo após a vírgula
Alex Bonel
1
\ u00A0 não funciona para mim. Não cria um espaço, apenas junta as palavras - Android 4.4.4, 5.0, 5.1
Marcel Bro
1
Em Kotlin, funciona muito bem. Eu substituo todos os espaços vazios por isso, e ele terá reticências dos últimos caracteres. str.replace ("", "\ u00A0") produz, "Hello wor ..." em vez de "Hello ..."
Seop Yoon
24

\u00A0é um espaço ininterrupto, \u0020não é um espaço ininterrupto

Brenagwynn
fonte
24

É possível usar  para ter uma solução legível. Incluir \u00A0ou  ou  /  no texto não transmite muita informação para o leitor do código-fonte (ou tradutor para esse assunto), a menos que você se lembre dos códigos hexadecimais. Esta é uma maneira de usar a entidade nomeada em strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
    <!ENTITY nbsp "&#160;"><!-- non-breaking space, U+00A0 -->
]>
<resources>
    ...
</resources>

Isso criará a declaração ausente. A declaração HTML original pode ser encontrada em https://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent referenciada a partir dos DTDs XHTML usuais . Tudo isso funciona, pois o analisador XML os lê e os substitui ao carregar o arquivo, de modo que a entidade não estará presente nos recursos compilados resultantes.

&nbsp;em CharSequencerecursos de texto Android ( )

<!-- Defined in <resources> -->
<string name="html_text">Don\'t break <b>this&nbsp;name</b></string>

<!-- Used in a layout -->
<TextView
    android:layout_width="130dp"
    android:layout_height="wrap_content"
    android:background="#10000000"
    android:text="@string/html_text"
    />

Dispositivo e visualização (a visualização não reconhece HTML)
HTML no dispositivo HTML em visualização

&nbsp; em recursos Android String (formatados)

<!-- Defined in <resources> -->
<string name="formatted_text">%1$s is&nbsp;nice</string>

<!-- Used in a layout -->
<TextView
    android:layout_width="130dp"
    android:layout_height="wrap_content"
    android:background="#10000000"
    tools:text="@string/formatted_text"
    />

Então, em código:

String contents = getString(R.string.formatted_text, "Using an &nbsp;");
((TextView)view.findViewById(android.R.id.text1)).setText(contents);

Dispositivo e visualização (a visualização não reconhece entidades e as strings Java são textos literais!)
formatado no dispositivo formatado na visualização

Mais truques

Esses são apenas exemplos de uso de entidades DTD, use-os de acordo com sua preferência.

<!ENTITY con "\&apos;"><!-- contraction, otherwise error: "Apostrophe not preceded by \"
                            Sadly &apos; cannot be overridden due to XML spec:
                            https://www.w3.org/TR/xml/#sec-predefined-ent -->
<!ENTITY param1 "&#37;1$s"><!-- format string argument #1 -->

<string name="original">Don\'t wrap %1$s</string>
<string name="with_entities">Don&con;t wrap &param1;</string>

Ambos ajudam a destacar: entidades XML destacadas

TWiStErRob
fonte
O Android lida muito bem com o personagem, sem necessidade de criar entidades apóstrofes. <string name="original">Don’t wrap %1$s</string>funciona como esperado.
Diti
1
@Diti Isso não é um APÓSTROFO , é uma MARCA DE COTAÇÃO ÚNICA DIREITA ; comparar 'VS . O Android não tem problemas com caracteres Unicode mais sofisticados, mas tem um problema com ASCII 0x27, que precisa de escape. A entidade é apenas uma conveniência, só coloquei lá para demonstrar onde ela pode ser útil.
TWiStErRob
Isso é excelente =) Obrigado. Acho isso muito mais limpo e fácil de ler.
Alex Hart
Ótima resposta, obrigado! Eu concordo que ter &nbsp;as strings é muito mais significativo para os tradutores do que o Unicode\u00A0
Marc Attinasi
1
@Seven é claro, veja a última seção (Mais truques) que adiciona cone param1no mesmo arquivo.
TWiStErRob
18

O TextView deve respeitar o espaço sem quebra

<string name="test">Hello&#160;world</string>

ou

new TextView("Hello\u00A0world");
rds
fonte
3

Uma situação única que encontrei foi adicionar um espaço ininterrupto a um recurso de string que recebia String.formatparâmetros.

<resources>
    <string name="answer_progress" formatted="false">Answered %d of %d</string>
</resources>

Tentei simplesmente copiar e colar o caractere de espaço não separável na string e ele foi substituído por um espaço antigo regular após a compilação.

Remover formatted = "false" , numerar os args de formato e usar a notação de barra invertida funcionou para mim:

<resources>
    <string name="answer_progress">Answered %1$d\u00A0of\u00A0%2$d</string>
</resources>
Jon
fonte
2

Isso funcionou para mim:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
    textview.setText(Html.fromHtml(your string, Html.FROM_HTML_MODE_LEGACY));
} else {
    textview.setText(Html.fromHtml(your string);
}
Madhan Sekar
fonte
1

Este é um exemplo de que usar nbsp em um TextView

<string name="text">Example:\u00A0</string>

Kameny
fonte
4
Isso deve ser \ u00A0
poitroae