Gostaria de referenciar uma string de outra string no meu arquivo strings.xml, como abaixo (observe especificamente o final do conteúdo da string "message_text"):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="button_text">Add item</string>
<string name="message_text">You don't have any items yet! Add one by pressing the \'@string/button_text\' button.</string>
</resources>
Eu tentei a sintaxe acima, mas o texto imprime o "@ string / button_text" como texto não criptografado. Não é o que eu quero. Gostaria que o texto da mensagem fosse impresso "Você ainda não possui nenhum item! Adicione um pressionando o botão 'Adicionar item'".
Existe alguma maneira conhecida de conseguir o que eu quero?
JUSTIFICATIVA:
Meu aplicativo tem uma lista de itens, mas quando essa lista está vazia, mostro um TextView "@android: id / empty". O texto nesse TextView é para informar ao usuário como adicionar um novo item. Gostaria de fazer meu layout à prova de idiotas às alterações (sim, sou o idiota em questão :-)
Respostas:
Uma ótima maneira de inserir uma string usada com frequência (por exemplo, nome do aplicativo) no xml sem usar o código Java: source
ATUALIZAR:
Você pode até definir sua entidade globalmente, por exemplo:
res / raw / entity.ent:
res / valores / string.xml:
fonte
É possível fazer referência uma dentro da outra, desde que toda a cadeia de caracteres consista no nome de referência. Por exemplo, isso funcionará:
É ainda mais útil para definir valores padrão:
Agora você pode usar
string_default
em qualquer lugar do seu código e alterar facilmente o padrão a qualquer momento.fonte
Eu acho que você não pode. Mas você pode "formatar" uma string como desejar:
No código:
fonte
String text = res.getString(R.string.message_text, res.getString(R.string.button_text));
é um pouco mais limpo.No Android, você não pode concatenar Strings dentro de xml
O seguinte não é suportado
Verifique este link abaixo para saber como alcançá-lo
Como concatenar várias seqüências de caracteres no XML do Android?
fonte
Eu criei um plugin gradle simples que permite que você indique uma string de outra. Você pode consultar cadeias definidas em outro arquivo, por exemplo, em uma variante ou biblioteca de construção diferente. Contras dessa abordagem - o refator do IDE não encontrará essas referências.
Use a
{{string_name}}
sintaxe para referenciar uma sequência:Para integrar o plug-in, basta adicionar o próximo código ao
build.gradle
arquivo no nível do aplicativo ou do módulo da bibliotecaATUALIZAÇÃO: a biblioteca não funciona com o plug-in Android gradle versão 3.0 e posterior porque a nova versão do plug-in usa aapt2, que empacota recursos no formato binário .flat, portanto, os recursos compactados não estão disponíveis para a biblioteca. Como solução temporária, você pode desativar o aapt2 configurando android.enableAapt2 = false no seu arquivo gradle.properties.
fonte
> Could not get unknown property 'referencedString'
Você pode usar sua própria lógica, que resolve as seqüências aninhadas recursivamente.
De um
Activity
, por exemplo, chame assimfonte
Estou ciente de que esta é uma publicação mais antiga, mas queria compartilhar a solução rápida e suja que encontrei para um projeto meu. Funciona apenas para TextViews, mas também pode ser adaptado a outros widgets. Observe que ele exige que o link seja colocado entre colchetes (por exemplo
[@string/foo]
).A desvantagem dessa abordagem é que
setText()
converte aCharSequence
para aString
, o que é um problema se você passar coisas como aSpannableString
; para o meu projeto, isso não foi um problema, pois eu o usei apenas para oTextViews
qual não precisava acessar do meuActivity
.fonte
Com a nova ligação de dados, você pode concatenar e fazer muito mais em seu xml.
por exemplo, se você recebeu message1 e message2, pode:
você pode até importar alguns utilitários de texto e chamar String.format e amigos.
infelizmente, se você deseja reutilizá-lo em vários lugares, pode ficar confuso, não deseja que esse código seja exibido em todos os lugares. e você não pode defini-los em xml em um só lugar (não que eu saiba), para que você possa criar uma classe que encapsule essas composições:
então você pode usá-lo (será necessário importar a classe com ligação de dados)
fonte
Além da resposta acima por Francesco Laurita https://stackoverflow.com/a/39870268/9400836
Parece que há um erro de compilação "& entity; foi referenciado, mas não declarado", que pode ser resolvido referenciando a declaração externa como esta
res / raw / entity.ent
res / valores / strings.xml
Embora compile e execute, ele tem um valor vazio. Talvez alguém saiba como resolver isso. Eu teria postado um comentário, mas a reputação mínima é 50.
fonte
Você pode usar espaços reservados de seqüência de caracteres (% s) e substituí-los usando java no tempo de execução
e em java
e, em seguida, defina-o no local em que ele usa a string
fonte
%1$s
,%2$s
etc., em vez de%s
.Criei uma pequena biblioteca que permite resolver esses espaços reservados no momento da construção, para que você não precise adicionar nenhum código Java / Kotlin para obter o que deseja.
Com base no seu exemplo, você teria que configurar suas strings assim:
E então o plugin cuidará de gerar o seguinte:
Funciona também para cadeias localizadas e de sabor, e também as cadeias geradas se manterão atualizadas sempre que você fizer alterações em seus modelos ou em seus valores.
Mais informações aqui: https://github.com/LikeTheSalad/android-string-reference
fonte