string.xml
Çalışma zamanında değer atanabilecek dize değerlerinde yer tutucuların olması mümkün müdür ?
Misal:
bazı dize PLACEHOLDER1 daha fazla dize
string.xml
Çalışma zamanında değer atanabilecek dize değerlerinde yer tutucuların olması mümkün müdür ?
Misal:
bazı dize PLACEHOLDER1 daha fazla dize
Yanıtlar:
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$s
bir dize ve%2$d
bir 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);
Dizeyi getString
biç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ğ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 mailCount
parametre 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 .
İlk gördüğümde %1$s
ve %2$d
kabul 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]
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
sicimd
ondalık tam sayıf
kayan nokta sayısıGri parçaların programlı olarak eklendiği aşağıdaki biçimlendirilmiş dizeyi oluşturacağız.
Ablam
Mary
ise12
yı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);
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$s
Tekrarlamak isterseniz, xml dosyasında birden çok kez olduğu gibi bir biçim belirteci kullanabilirsiniz .%%
Gerçek %
karakteri almak için kullanın .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.
<!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ı?
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. :)
xliff
Etiketlerin biçim belirteçleri etrafındaki anlamı nedir ? Yalnızca %s
ve %d
belirteçleri kendi başlarına kullanmanın aksine ne gibi ekstra değer katıyorlar ?
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.
Bununla birlikte, Elias Mårtenson'un “ çoğul” Android çoğul tedavisindeki cevabını da okumalısınız . "Sıfır" gibi belirli değerlerin yorumlanmasında bir sorun vardır.
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);
Şunları kullanabilirsiniz MessageFormat
:
<string name="customer_address">Wellcome: {0} {1}</string>
Java kodunda:
String text = MessageFormat(R.string.customer_address).format("Name","Family");
API seviye 1:
https://developer.android.com/reference/java/text/MessageFormat.html
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>
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 )
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)));
Kotlin'in kabul edilen cevabı ...
val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
resources.getString(int, ... args)
yöntem yöntemi yerine argümanlarla kullanmaktır String.format
. Bu kodda val
anahtar kelime dışında kotlin özellikleri de yoktur . Msbodw001