Dize'yi Android'de String.xml dosyasına dinamik olarak eklemek mümkün müdür?


Yanıtlar:


1035

Biçimlendirme ve Stil Oluşturma

Evet, Dize Kaynakları bölümünden aşağıdakilere bakın : Biçimlendirme ve Stil Oluşturma

Dizelerinizi kullanarak biçimlendirmeniz gerekiyorsa String.format(String, Object...), bunu biçim bağımsız değişkenlerinizi dize kaynağına koyarak yapabilirsiniz. Örneğin, aşağıdaki kaynakla:

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

Bu örnekte, biçim dizesinin iki bağımsız değişkeni vardır: %1$sbir dize ve %2$dbir ondalık sayıdır. Dizeyi uygulamanızdaki argümanlarla şu şekilde biçimlendirebilirsiniz:

Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);

Temel Kullanım

Dizeyi getStringbiçim dizesi olarak kullanan bir aşırı yüklemeye sahip olduğunu unutmayın :

String text = res.getString(R.string.welcome_messages, username, mailCount);

Çoğul

Çoğulları işlemeniz gerekiyorsa, şunu kullanın:

<plurals name="welcome_messages">
    <item quantity="one">Hello, %1$s! You have a new message.</item>
    <item quantity="other">Hello, %1$s! You have %2$d new messages.</item>
</plurals>

İlk mailCountparametre hangi formatın kullanılacağına (tekli veya çoğul) karar vermek için kullanılır, diğer parametreler sizin ikamelerinizdir:

Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);

Daha fazla bilgi için Dize Kaynakları: Çoğullar konusuna bakın .


61
İlk kod örneğindeki String.format çağrısı aslında gerekli değildir, Resources.getString () biçimlendirmeyi destekler, bkz: developer.android.com/reference/android/content/res/… , java.lang.Object ...)
Arnaud

16
String.xml dosyasındaki Çoğullar için R.string.welcome_messages yerine R.plurals.welcome_messages olarak id vermelisiniz
om252345 9:03

sadece son öğe dizesini döndüren çoğul şey ... nasıl ekleme dize alabilirsiniz herhangi bir fikir.
CoDe

1
Dizenizi biçimlendirmek için bu yöntemi kullanırken, xml dizesi metninde bulunabilecek köprüler vb. Gibi kullanabileceğiniz tüm meta etiketleri kaldırdı
Jonathan

4
Dize% 1 $ s, ondalık% 2 $ d ve tamsayı ne anlama geliyor? % 1,% 2'nin anlamı nedir? Bu parametre sayımı nedir?. üçüncü parametre istiyorsam% 3'ten bahsediliyor mu?
reegan29

260

Tamamlayıcı Cevap

İlk gördüğümde %1$sve %2$dkabul edilen cevapta hiçbir anlam ifade etmiyordu. İşte biraz daha açıklama.

Bunlara biçim belirteçleri denir. Xml dizesinde bunlar

%[parameter_index$][format_type] 
  • % : Yüzde işareti, biçim belirticinin başlangıcını işaretler.
  • parametre dizini : Bu bir sayı ve ardından dolar işareti gelir. Eğer dizeye eklemek istedim üç parametre olsaydı, o zaman aranmak 1$, 2$ve 3$. Bunları kaynak dizesine yerleştirdiğiniz sıra önemli değil, yalnızca parametreleri sağladığınız sıra.
  • biçim türü : Bir şeyleri biçimlendirmenin birçok yolu vardır ( belgelere bakın ). İşte bazı yaygın olanları:

    • s sicim
    • d ondalık tam sayı
    • f kayan nokta sayısı

Misal

Gri parçaların programlı olarak eklendiği aşağıdaki biçimlendirilmiş dizeyi oluşturacağız.

Ablam Maryise 12yıllık.

string.xml

<string name="my_xml_string">My sister %1$s is %2$d years old.</string>

MyActivity.java

String myString = "Mary";
int myInt = 12;
String formatted = getString(R.string.my_xml_string, myString, myInt);

notlar

  • Kullanabilirdim getStringçünkü bir Faaliyetteydim. Sen kullanabilirsiniz context.getResources().getString(...)mevcut değilse.
  • String.format() bir Dizeyi de biçimlendirir.
  • 1$Ve 2$terimler bu sırayla kullanılacak gerekmez. Yani, 2$daha önce gelebilir 1$. Bu, bir uygulamayı farklı bir kelime sırası kullanan diller için uluslararasılaştırırken kullanışlıdır.
  • %1$sTekrarlamak isterseniz, xml dosyasında birden çok kez olduğu gibi bir biçim belirteci kullanabilirsiniz .
  • %%Gerçek %karakteri almak için kullanın .
  • Daha fazla ayrıntı için aşağıdaki yararlı öğreticiyi okuyun: Android SDK Hızlı İpucu: Kaynak Dizelerini Biçimlendirme

125

Herhangi bir Java kodu kullanmadan gerçek strings.xml dosyasından bir parametre kullanmak istediğinizde:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
  <!ENTITY appname "WhereDat">
  <!ENTITY author "Oded">
]>

<resources>
    <string name="app_name">&appname;</string>
    <string name="description">The &appname; app was created by &author;</string>
</resources>

Bu, kaynak dosyalarda çalışmaz, yani değişkenler, gereksinim duyan her XML dosyasına kopyalanmalıdır.


<! [CDATA [& param;
Hermann Poilpre

2
<!DOCTYPE... ]>Parçayı ayrı bir dosyada tanımlamanın ve birden fazla kaynak dosyasına eklemenin herhangi bir yolu var mı ? Bunu başarmak için herhangi bir hile var mı?
prom85

18

Aynı arıyordum ve sonunda aşağıdaki çok basit çözümü buldum. En iyisi: kutunun dışında çalışır.
1. dize kaynak kaynağınızı değiştirin:

<string name="welcome_messages">Hello, <xliff:g name="name">%s</xliff:g>! You have 
<xliff:g name="count">%d</xliff:g> new messages.</string>

2. dize yerine koymayı kullanın:

c.getString(R.string.welcome_messages,name,count);

burada c Bağlam, ad bir dize değişkeni ve int değişkeninizi sayın

Eklemeniz gerekecek

<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">

res / strings.xml dosyasında. Benim için çalışıyor. :)


2
xliffEtiketlerin biçim belirteçleri etrafındaki anlamı nedir ? Yalnızca %sve %dbelirteçleri kendi başlarına kullanmanın aksine ne gibi ekstra değer katıyorlar ?
Richard Le Mesurier

Xliff etiketindeki "name" özelliği, çevirmene orada ikame edilecek şey hakkında bir ipucu vermenin bir yoludur. Bazen "% s" nin ne anlama geldiğini tahmin etmek kolay değildir.
hugomg

3

Kotlin'de sadece dize değerinizi şu şekilde ayarlamanız gerekir:

<string name="song_number_and_title">"%1$d ~ %2$s"</string>

Düzeninizde bir metin görünümü oluşturun:

<TextView android:id="@+id/song_number_and_title"/>

Anko kullanıyorsanız kodunuzda bunu yapın:

val song = database.use { // get your song from the database }
song_number_and_title.setText(resources.getString(R.string.song_number_and_title, song.number, song.title))  

Kaynaklarınızı uygulama bağlamından almanız gerekebilir.


5
Java örneklerinden farkı nedir? Fark görmüyorum
Janusz Hain


1

res / değerleri / string.xml içinde

<resources>
    <string name="app_name">Hello World</string>
    <string name="my_application">Application name: %s, package name: %s</string>
</resources>

java kodunda

String[] args = new String[2];
args[0] = context.getString(R.string.app_name);
args[1] = context.getPackageName();
String textMessage = context.getString(R.string.my_application,(Object[]) args);


1

Yüzde (%) yazmak istiyorsanız, çoğaltın:

<string name="percent">%1$d%%</string>

label.text = getString(R.string.percent, 75) // Output: 75%.

Sadece yazarsanız %1$d%, hatayı alırsınız: Format string 'percent' is not a valid format string so it should not be passed to String.format.


0

Evet! bunu herhangi bir Java / Kotlin kodu yazmadan yapabilirsiniz, sadece oluşturduğum bu küçük kütüphaneyi kullanarak XML oluşturur, bu da derleme sırasında bunu yapar, böylece uygulamanız bundan etkilenmez: https://github.com/LikeTheSalad/android -String referans

kullanım

Dizeleriniz:

<resources>
    <string name="app_name">My App Name</string>
    <string name="template_welcome_message">Welcome to ${app_name}</string>
</resources>

Oluşturulduktan sonra oluşturulan dize:

<!--resolved.xml-->
<resources>
    <string name="welcome_message">Welcome to My App Name</string>
</resources>

0

Soruna Doğrudan Kotlin Çözümü:

strings.xml

<string name="customer_message">Hello, %1$s!\nYou have %2$d Products in your cart.</string>

kotlinActivityORFragmentFile.kt:

val username = "Andrew"
val products = 1000
val text: String = String.format(
      resources.getString(R.string.customer_message), username, products )

0

Dize dosyanızda bunu kullanın

<string name="redeem_point"> You currently have %s points(%s points = 1 %s)</string>

Ve kodunuzda buna göre kullanın

coinsTextTV.setText(String.format(getContext().getString(R.string.redeem_point), rewardPoints.getReward_points()
                        , rewardPoints.getConversion_rate(), getString(R.string.rs)));

-1

Kotlin'in kabul edilen cevabı ...

val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)

3
Daha doğru bir resources.getString(int, ... args)yöntem yöntemi yerine argümanlarla kullanmaktır String.format. Bu kodda valanahtar kelime dışında kotlin özellikleri de yoktur . Msbodw001
dant3
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.