É possível ter espaços reservados em valores de seqüência string.xml
que possam ser atribuídos a valores em tempo de execução?
Exemplo:
alguma string PLACEHOLDER1 um pouco mais de string
android
string
string-formatting
android-resources
SoftReference
fonte
fonte
Respostas:
Formatação e estilo
Sim, consulte o seguinte em Recursos da cadeia de caracteres: Formatação e estilo
Uso básico
Observe que
getString
há uma sobrecarga que usa a string como uma string de formato:Plurais
Se você precisar lidar com plurais, use o seguinte:
O primeiro
mailCount
parâmetro é usado para decidir qual formato usar (único ou plural); os outros parâmetros são suas substituições:Consulte Recursos de seqüência de caracteres: Plurais para obter mais detalhes.
fonte
Resposta complementar
Quando vi pela primeira vez
%1$s
e%2$d
na resposta aceita, não fazia sentido. Aqui está um pouco mais de explicação.Eles são chamados de especificadores de formato. Na sequência xml, eles estão na forma de
1$
,2$
e3$
. A ordem em que você as coloca na cadeia de recursos não importa, apenas a ordem em que você fornece os parâmetros.tipo de formato : existem várias maneiras de formatar as coisas ( consulte a documentação ). Aqui estão alguns comuns:
s
cordad
número inteiro decimalf
número de ponto flutuanteExemplo
Criaremos a seguinte string formatada em que as partes cinzas são inseridas programaticamente.
string.xml
MyActivity.java
Notas
getString
porque estava em uma atividade. Você pode usarcontext.getResources().getString(...)
se não estiver disponível.String.format()
também formatará uma String.1$
e2$
não precisam ser usados nessa ordem. Ou seja,2$
pode vir antes1$
. Isso é útil ao internacionalizar um aplicativo para idiomas que usam uma ordem de palavras diferente.%1$s
várias vezes no xml, se desejar repeti-lo.%%
para obter o%
personagem real .fonte
Quando você deseja usar um parâmetro do arquivo strings.xml real sem usar nenhum código Java:
Isso não funciona nos arquivos de recursos, ou seja, as variáveis devem ser copiadas em cada arquivo XML que precisa delas.
fonte
<!DOCTYPE... ]>
peça em um arquivo separado e incluí-la em vários arquivos de recursos? Algum truque para conseguir isso?Estava procurando o mesmo e finalmente encontrou a seguinte solução muito simples. Melhor: funciona imediatamente.
1. altere seu recurso de string:
2. use substituição de string:
c.getString(R.string.welcome_messages,name,count);
onde c é o contexto, name é uma variável de string e conta sua variável int
Você precisará incluir
em seu res / strings.xml. Funciona para mim. :)
fonte
xliff
tags nos especificadores de formato? Que valor extra eles agregam em vez de usar os especificadores%s
e%d
por conta própria?No Kotlin, você só precisa definir o valor da string assim:
Crie uma exibição de texto no seu layout:
Em seguida, faça isso no seu código se você estiver usando o Anko:
Pode ser necessário obter seus recursos no contexto do aplicativo.
fonte
No entanto, você também deve ler a resposta de Elias Mårtenson no plural de Android, tratamento de "zero" . Há um problema com a interpretação de certos valores, como "zero".
fonte
em res / values / string.xml
no código java
fonte
Você pode usar
MessageFormat
:No código Java:
API nível 1:
https://developer.android.com/reference/java/text/MessageFormat.html
fonte
Se você deseja escrever por cento (%), duplique-o:
Se você escrever simplesmente
%1$d%
, você receberá o erro:Format string 'percent' is not a valid format string so it should not be passed to String.format
.fonte
Sim! você pode fazer isso sem escrever nenhum código Java / Kotlin, apenas XML, usando esta pequena biblioteca que eu criei, que faz isso no momento da construção, para que seu aplicativo não seja afetado por ele: https://github.com/LikeTheSalad/android -string-reference
Uso
Suas cordas:
A sequência gerada após a construção:
fonte
Uma solução direta da Kotlin para o problema:
strings.xml
kotlinActivityORFragmentFile.kt:
fonte
No seu arquivo de string, use este
E no seu código, use da mesma maneira
fonte
Versão Kotlin da resposta aceita ...
fonte
resources.getString(int, ... args)
método com argumentos em vez deString.format
. Também não há detalhes específicos do kotlin neste código, além daval
palavra - chave. Veja a resposta de msbodw001