Respostas:
TextView
respeita o caractere de espaço sem quebra Unicode ( \u00A0
), que seria uma solução mais simples / leve do que HTML.
\u00A0
é um espaço ininterrupto, \u0020
não é um espaço ininterrupto
É possível usar
para ter uma solução legível. Incluir \u00A0
ou  
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 " "><!-- 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.
em CharSequence
recursos de texto Android ( )<!-- Defined in <resources> -->
<string name="html_text">Don\'t break <b>this 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)
em recursos Android String (formatados)<!-- Defined in <resources> -->
<string name="formatted_text">%1$s is 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 ");
((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!)
Esses são apenas exemplos de uso de entidades DTD, use-os de acordo com sua preferência.
<!ENTITY con "\'"><!-- contraction, otherwise error: "Apostrophe not preceded by \"
Sadly ' cannot be overridden due to XML spec:
https://www.w3.org/TR/xml/#sec-predefined-ent -->
<!ENTITY param1 "%1$s"><!-- format string argument #1 -->
<string name="original">Don\'t wrap %1$s</string>
<string name="with_entities">Don&con;t wrap ¶m1;</string>
’
muito bem com o personagem, sem necessidade de criar entidades apóstrofes. <string name="original">Don’t wrap %1$s</string>
funciona como esperado.
'
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.
as strings é muito mais significativo para os tradutores do que o Unicode\u00A0
con
e param1
no mesmo arquivo.
Uma situação única que encontrei foi adicionar um espaço ininterrupto a um recurso de string que recebia String.format
parâ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>
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);
}