Dize kaynakları, uygulamanız için isteğe bağlı metin biçimlendirme ve biçimlendirme özelliklerine sahip metin dizeleri sağlar. Uygulamanıza dizeler sağlayabilecek üç kaynak türü vardır:
- String
- Tek dize sağlayan XML kaynağı.
- Dize dizisi
- Dize dizisi sağlayan XML kaynağıdır.
- Miktar Dizeleri (Çoğul)
- Çoğullaştırma için farklı dizeler içeren XML kaynağı.
Tüm dizeler, bazı stil işaretleme ve biçimlendirme bağımsız değişkenleri uygulayabilir. Dizelerin stilini belirleme ve biçimlendirmeyle ilgili bilgi için Biçimlendirme ve Stil hakkındaki bölüme bakın.
Dize
Uygulamadan veya diğer kaynak dosyalarından (XML düzeni gibi) referans verilebilen tek bir dize.
Not: Dize, name
özelliğinde sağlanan değer (XML dosyasının adı değil) kullanılarak referans verilen basit bir kaynaktır. Böylece bir XML dosyasındaki dize kaynaklarını bir <resources>
öğesi altında diğer basit kaynaklarla birleştirebilirsiniz.
- dosya konumu:
res/values/filename.xml
Dosya adı rastgeledir.<string>
öğesininname
değeri, kaynak kimliği olarak kullanılır.- derlenmiş kaynak veri türü:
String
öğesinin kaynak işaretçisi.- kaynak referansı:
-
Java'da:
R.string.string_name
XML'de:@string/string_name
- söz dizimi:
-
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="string_name" >text_string</string> </resources>
- öğeler:
- örnek:
- XML dosyasının
res/values/strings.xml
konumuna kaydedildi:<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello!</string> </resources>
Bu düzen XML'si, bir Görünüme bir dize uygular:
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" />
Bu uygulama kodu bir dize alır:
Bir dizeyi almak için
getString(int)
veyagetText(int)
kullanabilirsiniz.getText(int)
, dizeye uygulanan zengin metin stillerini korur.
Dize dizisi
Uygulamadan referans verilebilen bir dize dizisi.
Not: Dize dizisi, name
özelliğinde sağlanan değer (XML dosyasının adı değil) kullanılarak referans verilen basit bir kaynaktır. Bu nedenle bir <resources>
öğesi altında, bir XML dosyasındaki dize dizisi kaynaklarını diğer basit kaynaklarla birleştirebilirsiniz.
- dosya konumu:
res/values/filename.xml
Dosya adı rastgeledir.<string-array>
öğesininname
değeri, kaynak kimliği olarak kullanılır.- derlenmiş kaynak veri türü:
- Bir
String
dizisine kaynak işaretçisi. - kaynak referansı:
-
Java'da:
R.array.string_array_name
XML'de:@[package:]array/string_array_name
- söz dizimi:
-
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="string_array_name"> <item >text_string</item> </string-array> </resources>
- öğeler:
- örnek:
- XML dosyasının
res/values/strings.xml
konumuna kaydedildi:<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="planets_array"> <item>Mercury</item> <item>Venus</item> <item>Earth</item> <item>Mars</item> </string-array> </resources>
Bu uygulama kodu bir dize dizisi alır:
Kotlin
val array: Array<String> =
resources
.getStringArray
(R.array.planets_array)Java
Resources res =
getResources()
; String[] planets = res.getStringArray
(R.array.planets_array);
Miktar dizeleri (çoğul)
Miktarla dil bilgisinin uyuşması için farklı dillerin farklı kuralları vardır. Örneğin, İngilizcede "1" sayısı özel bir sayıdır. "1 kitap" yazıyoruz, ancak diğer miktarlar için "n kitap" yazarız. Tekil ve çoğul arasındaki bu ayrım çok yaygındır, ancak diğer diller arasında daha hassas ayrımlar yapılır. Android tarafından desteklenen tam grup zero
,
one
, two
, few
, many
ve other
'dir.
Belirli bir dil ve miktar için hangi durumun kullanılacağına karar verme kuralları çok karmaşık olabilir. Bu nedenle Android, getQuantityString()
gibi yöntemler sunarak sizin için uygun kaynağı seçmenize olanak tanır.
Geçmişte "miktar dizeleri" olarak adlandırılsa da (API'de de bu şekilde adlandırılıyordu) miktar dizeleri yalnızca çoğul haller için kullanılmalıdır. Örneğin, okunmamış iletiler olduğunda Gmail'in "Gelen Kutusu" ve "Gelen Kutusu (12)" gibi bir komut uygulamak için miktar dizeleri kullanmak hata olur. if
ifadesi yerine miktar dizeleri kullanmak pratik görünebilir ancak bazı dillerde (Çince gibi) bu dil bilgisi ayrımlarını hiçbir şekilde yapmadığı için her zaman other
dizesini elde edersiniz.
Kullanılacak dizenin seçimi yalnızca dil bilgisi gerekliliğine göre yapılır.
İngilizcede zero
dizesi, miktar 0 olsa bile yoksayılır. Bunun nedeni, 0'ın dil bilgisi açısından 2'den veya 1 dışında herhangi bir sayıdan ("sıfır kitap", "bir kitap", "iki kitap" vb.) farklı olmamasıdır. Buna karşılık, Korecede yalnızca other
dizesi kullanılır.
Diyelim ki two
yalnızca 2 miktar için geçerliymiş gibi konuşulduğunda da yanlış yönlendirilmeyin. Bir dil, 2, 12, 102 (vb.) sayılarının birbiri gibi ancak diğer miktarlardan farklı şekilde ele alınmasını gerektirebilir. Dilinde hangi ayrımlar üzerine konuşulduğu
konusunda çevirmeninize güvenin.
İletinizde miktar numarası yoksa çoğul için iyi bir aday olmayabilir. Örneğin, Litvancada hem 1 hem de 101 için tekil biçim kullanılır. Dolayısıyla "1 kitap" "1 knyga" olarak, "101 kitap" ise "101 knyga" olarak çevrilir. "Bir kitap" ise "knyga" ve "birçok kitap" "daug knyg∨"dur. İngilizce çoğul mesajda asıl numara olmadan "bir kitap" (tekil) ve "birçok kitap" (çoğul) bulunuyorsa söz konusu ifade "knyga" (bir kitap)/"daug knyg∨" (birçok kitap) olarak çevrilebilir ancak Litvanca kurallarında 101'e ulaşana kadar "knyga" (tek kitap) olarak gösterilir.
Çoğunlukla "Kitaplar: 1" gibi miktar açısından nötr formülasyonlar kullanarak miktar dizelerinden kaçınmak mümkündür. Bu, uygulamanız için kabul edilebilir bir tarz olursa, sizin hayatınızı ve çevirmenlerinizin hayatını kolaylaştırır.
API 24 ve sonraki sürümlerde bunun yerine çok daha güçlü ICU MessageFormat
sınıfını kullanabilirsiniz.
Not: Çoğul toplama, name
özelliğinde sağlanan değer (XML dosyasının adı değil) kullanılarak başvurulan basit bir kaynaktır. Bu nedenle, bir XML dosyasındaki çoğul kaynakları diğer basit kaynaklarla tek bir <resources>
öğesi altında birleştirebilirsiniz.
- dosya konumu:
res/values/filename.xml
Dosya adı rastgeledir.<plurals>
öğesininname
değeri, kaynak kimliği olarak kullanılır.- kaynak referansı:
-
Java'da:
R.plurals.plural_name
- söz dizimi:
-
<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="plural_name"> <item quantity=["zero" | "one" | "two" | "few" | "many" | "other"] >text_string</item> </plurals> </resources>
- öğeler:
- örnek:
- XML dosyasının
res/values/strings.xml
konumuna kaydedildi:<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberOfSongsAvailable"> <!-- As a developer, you should always supply "one" and "other" strings. Your translators will know which strings are actually needed for their language. Always include %d in "one" because translators will need to use %d for languages where "one" doesn't mean 1 (as explained above). --> <item quantity="one">%d song found.</item> <item quantity="other">%d songs found.</item> </plurals> </resources>
res/values-pl/strings.xml
konumuna kaydedilen XML dosyası:<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberOfSongsAvailable"> <item quantity="one">Znaleziono %d piosenkę.</item> <item quantity="few">Znaleziono %d piosenki.</item> <item quantity="other">Znaleziono %d piosenek.</item> </plurals> </resources>
Kullanım:
Kotlin
val count = getNumberOfSongsAvailable() val songsFound = resources.
getQuantityString
(R.plurals.numberOfSongsAvailable, count, count)Java
int count = getNumberOfSongsAvailable(); Resources res =
getResources()
; String songsFound = res.getQuantityString
(R.plurals.numberOfSongsAvailable, count, count);getQuantityString()
yöntemini kullanırken dizeniz bir sayı içeren dize biçimlendirmesi içeriyorsacount
öğesini iki kez iletmeniz gerekir. Örneğin,%d songs found
dizesi için ilkcount
parametresi uygun çoğul dizeyi seçer ve ikincicount
parametresi%d
yer tutucusuna eklenir. Çoğul dizeleriniz dize biçimlendirmesi içermiyorsa üçüncü parametreyigetQuantityString
öğesine iletmeniz gerekmez.
Biçim ve stil
Dize kaynaklarınızı doğru bir şekilde biçimlendirmek ve biçimlendirmek için bilmeniz gereken birkaç önemli nokta aşağıda verilmiştir.
Özel karakterleri ele alın
Bir dize, XML'de özel kullanımı olan karakterler içerdiğinde standart XML/HTML çıkış kurallarına göre karakterlerden çıkış yapmanız gerekir. Android'de özel anlamı olan bir karakterden çıkış yapmanız gerekiyorsa başta ters eğik çizgi kullanmanız gerekir.
Android, varsayılan olarak boşluk karakteri dizilerini tek bir alana daraltır. Dizenizin ilgili kısmını çift tırnak içine alarak bunu önleyebilirsiniz. Bu durumda, tüm boşluk karakterleri (yeni satırlar dahil) tırnak içine alınan bölge içinde korunur. Çift tırnak, normal tekli çıkış karaktersiz tırnak işareti kullanmanıza da olanak tanır.
Karakter | Çıkış karakterli formlar |
---|---|
@ | \@ |
? | \? |
Yeni satır | \n |
Sekme | \t |
U+XXXX Unicode karakteri | \uXXXX |
Tek tırnak işareti (' ) |
Aşağıdakilerden herhangi biri:
|
Çift tırnak (" ) |
\"
Dizeyi tek tırnak içine almanın işe yaramadığını unutmayın. |
Boşlukların daraltılması ve Android çıkışları, kaynak dosyanız XML olarak ayrıştırıldıktan sonra gerçekleşir. Bu, dosya XML olarak ayrıştırıldıktan sonra tüm Unicode boşlukları olduğundan <string>      </string>
(boşluk, noktalama boşluğu, Unicode Em boşluğu) tek bir boşluk (" "
) haline gelecek şekilde daraltılır.
Bu alanları oldukları gibi korumak için tırnak işareti (<string>"      "</string>
) veya Android çıkış karakterlerini (<string> \u0032 \u8200 \u8195</string>
) kullanabilirsiniz.
Not: XML ayrıştırıcı açısından <string>"Test this"</string>
ile <string>"Test this"</string>
arasında hiçbir fark yoktur. Her iki form da tırnak işareti göstermez ancak Android boşluklarını koruyan alıntıları tetikler (bu durumda bunun pratik bir etkisi olmaz).
Dizeleri biçimlendirme
Dizelerinizi biçimlendirmeniz gerekiyorsa aşağıdaki örnek kaynakta gösterildiği gibi, biçim bağımsız değişkenlerinizi dize kaynağına yerleştirerek bunu yapabilirsiniz.
<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
ondalık sayıdır. Ardından getString(int, Object...)
yöntemini çağırarak dizeyi biçimlendirin. Örneğin:
Kotlin
var text = getString(R.string.welcome_messages, username, mailCount)
Java
String text = getString(R.string.welcome_messages, username, mailCount);
HTML işaretlemesiyle stil belirleme
HTML işaretlemesi ile dizelerinize stil ekleyebilirsiniz. Örneğin:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="welcome">Welcome to <b>Android</b>!</string> </resources>
Aşağıdaki HTML öğeleri desteklenir:
- Kalın: <b>
- İtalik: <i>, <cite>, <dfn>, <em>
- %25 daha büyük metin: <big>
- %20 daha küçük metin: <small>
- Yazı tipi özelliklerini ayarlama: <font face=”font_family“ color=”hex_color”>. Olası yazı tipi ailelerine örnek olarak
monospace
,serif
vesans_serif
verilebilir. - Tek aralıklı yazı tipi ailesi belirleme: <tt>
- Üstü çizili: <s>, <strike>, <del>
- Altı çizili: <u>
- Üst simge: <sup>
- Alt simge: <sub>
- Madde işaretleri: <ul>, <li>
- Satır sonları: <br>
- Bölüm: <div>
- CSS stili: <span style=”color|background_color|text-decoration”>
- Paragraflar: <p dir=”rtl | ltr” style=”...”>
Biçimlendirme uygulamıyorsanız TextView metnini doğrudan setText(java.lang.CharSequence)
yöntemini çağırarak ayarlayabilirsiniz. Ancak bazı durumlarda, biçim dizesi olarak da kullanılan, stilli bir metin kaynağı oluşturmak isteyebilirsiniz. Normalde format(String, Object...)
ve getString(int, Object...)
yöntemleri dizedeki tüm stil bilgilerini çıkardığından bu işe yaramaz. Bunun geçici çözümü, çıkış karakterli varlıklar içeren HTML etiketlerini yazmaktır. Bunlar, biçimlendirme tamamlandıktan sonra fromHtml(String)
ile kurtarılır. Örneğin:
- Stilize edilmiş metin kaynağınızı HTML çıkış karakterli dize olarak depolayın:
<resources> <string name="welcome_messages">Hello, %1$s! You have <b>%2$d new messages</b>.</string> </resources>
Bu biçimlendirilmiş dizeye bir
<b>
öğesi eklenir. Açılış ayracının<
gösterimi kullanılarak HTML çıkışlı olduğuna dikkat edin. - Daha sonra, dizeyi her zamanki gibi biçimlendirin ve ayrıca HTML metnini stilize edilmiş metne dönüştürmek için
fromHtml(String)
işlevini çağırın:Kotlin
val text: String = getString(R.string.welcome_messages, username, mailCount) val styledText: Spanned = Html.fromHtml(text, FROM_HTML_MODE_LEGACY)
Java
String text = getString(R.string.welcome_messages, username, mailCount); Spanned styledText = Html.fromHtml(text, FROM_HTML_MODE_LEGACY);
fromHtml(String)
yöntemi tüm HTML varlıklarını biçimlendirdiğinden, biçimlendirilmiş metinle kullandığınız dizelerde olası tüm HTML karakterlerini htmlEncode(String)
kullanarak kod dışı bıraktığınızdan emin olun. Örneğin, "<" veya "&" gibi karakterler içeren bir dizeyi biçimlendiriyorsanız biçimlendirmeden önce bunların çıkış yapılması gerekir. Böylece, biçimlendirilmiş dize fromHtml(String)
üzerinden iletildiğinde, karakterler orijinal oldukları gibi çıkar. Örneğin:
Kotlin
val escapedUsername: String = TextUtils.htmlEncode
(username)
val text: String = getString(R.string.welcome_messages, escapedUsername, mailCount)
val styledText: Spanned = Html.fromHtml(text, FROM_HTML_MODE_LEGACY)
Java
String escapedUsername = TextUtils.htmlEncode
(username);
String text = getString(R.string.welcome_messages, escapedUsername, mailCount);
Spanned styledText = Html.fromHtml(text);
Spannable'larla stil oluşturma
Spannable
, renk ve yazı tipi ağırlığı gibi yazı tipi özellikleriyle biçimlendirebileceğiniz bir metin nesnesidir. Metninizi oluşturmak için SpannableStringBuilder
kullanırsınız ve ardından android.text.style
paketinde tanımlanan stilleri metne uygularsınız.
Genişletilebilir metin oluşturma işleminin büyük bir kısmını ayarlamak için aşağıdaki yardımcı yöntemleri kullanabilirsiniz:
Kotlin
/** * Returns a CharSequence that concatenates the specified array of CharSequence * objects and then applies a list of zero or more tags to the entire range. * * @param content an array of character sequences to apply a style to * @param tags the styled span objects to apply to the content * such as android.text.style.StyleSpan */ private fun apply(content: Array<out CharSequence>, vararg tags: Any): CharSequence { return SpannableStringBuilder().apply { openTags(tags) content.forEach { charSequence -> append(charSequence) } closeTags(tags) } } /** * Iterates over an array of tags and applies them to the beginning of the specified * Spannable object so that future text appended to the text will have the styling * applied to it. Do not call this method directly. */ private fun Spannable.openTags(tags: Array<out Any>) { tags.forEach { tag -> setSpan(tag, 0, 0, Spannable.SPAN_MARK_MARK) } } /** * "Closes" the specified tags on a Spannable by updating the spans to be * endpoint-exclusive so that future text appended to the end will not take * on the same styling. Do not call this method directly. */ private fun Spannable.closeTags(tags: Array<out Any>) { tags.forEach { tag -> if (length > 0) { setSpan(tag, 0, length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) } else { removeSpan(tag) } } }
Java
/** * Returns a CharSequence that concatenates the specified array of CharSequence * objects and then applies a list of zero or more tags to the entire range. * * @param content an array of character sequences to apply a style to * @param tags the styled span objects to apply to the content * such as android.text.style.StyleSpan * */ private static CharSequence applyStyles(CharSequence[] content, Object[] tags) { SpannableStringBuilder text = new SpannableStringBuilder(); openTags(text, tags); for (CharSequence item : content) { text.append(item); } closeTags(text, tags); return text; } /** * Iterates over an array of tags and applies them to the beginning of the specified * Spannable object so that future text appended to the text will have the styling * applied to it. Do not call this method directly. */ private static void openTags(Spannable text, Object[] tags) { for (Object tag : tags) { text.setSpan(tag, 0, 0, Spannable.SPAN_MARK_MARK); } } /** * "Closes" the specified tags on a Spannable by updating the spans to be * endpoint-exclusive so that future text appended to the end will not take * on the same styling. Do not call this method directly. */ private static void closeTags(Spannable text, Object[] tags) { int len = text.length(); for (Object tag : tags) { if (len > 0) { text.setSpan(tag, 0, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } else { text.removeSpan(tag); } } }
Aşağıdaki bold
, italic
ve color
yöntemleri yukarıdaki yardımcı yöntemleri sarmalar ve android.text.style
paketinde tanımlanan stillerin uygulanmasına dair belirli örnekleri gösterir. Diğer metin stili türlerini yapmak için benzer yöntemler oluşturabilirsiniz.
Kotlin
/** * Returns a CharSequence that applies boldface to the concatenation * of the specified CharSequence objects. */ fun bold(vararg content: CharSequence): CharSequence = apply(content, StyleSpan(Typeface.BOLD)) /** * Returns a CharSequence that applies italics to the concatenation * of the specified CharSequence objects. */ fun italic(vararg content: CharSequence): CharSequence = apply(content, StyleSpan(Typeface.ITALIC)) /** * Returns a CharSequence that applies a foreground color to the * concatenation of the specified CharSequence objects. */ fun color(color: Int, vararg content: CharSequence): CharSequence = apply(content, ForegroundColorSpan(color))
Java
/** * Returns a CharSequence that applies boldface to the concatenation * of the specified CharSequence objects. */ public static CharSequence bold(CharSequence... content) { return apply(content, new StyleSpan(Typeface.BOLD)); } /** * Returns a CharSequence that applies italics to the concatenation * of the specified CharSequence objects. */ public static CharSequence italic(CharSequence... content) { return apply(content, new StyleSpan(Typeface.ITALIC)); } /** * Returns a CharSequence that applies a foreground color to the * concatenation of the specified CharSequence objects. */ public static CharSequence color(int color, CharSequence... content) { return apply(content, new ForegroundColorSpan(color)); }
Aşağıda, bir ifade içindeki ayrı ayrı kelimelere çeşitli stiller uygulamak için bu yöntemlerin nasıl birbirine bağlanacağına dair bir örnek verilmiştir:
Kotlin
// Create an italic "hello, " a red "world", // and bold the entire sequence. val text: CharSequence = bold(italic(getString(R.string.hello)), color(Color.RED, getString(R.string.world)))
Java
// Create an italic "hello, " a red "world", // and bold the entire sequence. CharSequence text = bold(italic(getString(R.string.hello)), color(Color.RED, getString(R.string.world)));
Core-ktx Kotlin modülü, aralıklarla çalışmayı daha da kolaylaştıran uzantı işlevleri de içerir. Daha fazla bilgi için GitHub'daki android.text paketi dokümanlarına göz atabilirsiniz.
Aralıklarla çalışma hakkında daha fazla bilgi için aşağıdaki bağlantılara bakın:
Ek açıklamalarla stil belirleme
string.xml kaynak dosyalarınızda <annotation>
etiketiyle birlikte Annotation
sınıfını kullanarak karmaşık veya özel stil uygulayabilirsiniz. Ek açıklama etiketi, XML'de çerçevenin Annotation
aralıklarına dönüştürdüğü özel anahtar/değer çiftleri tanımlayarak dizenin bölümlerini özel stil için işaretlemenize olanak tanır. Daha sonra bu ek açıklamaları alabilir ve stili uygulamak için anahtar ve değeri kullanabilirsiniz.
Ek açıklama oluştururken her string.xml dosyasındaki dizenin tüm çevirilerine <annotation>
etiketini eklediğinizden emin olun.
Tüm dillerde "metin" kelimesine özel bir yazı tipi uygulama
Örnek - özel yazı tipi ekleme
-
<annotation>
etiketini ekleyin ve anahtar/değer çiftini tanımlayın. Bu örnekte, font anahtarı ve değer, kullanmak istediğimiz yazı tipinin türüdür: title_emphasis// values/strings.xml <string name="title">Best practices for <annotation font="title_emphasis">text</annotation> on Android</string> // values-es/strings.xml <string name="title"><annotation font="title_emphasis">Texto</annotation> en Android: mejores prácticas</string>
-
Dize kaynağını yükleyin ve font tuşuyla ek açıklamaları bulun. Ardından bir özel kapsam oluşturup mevcut kapsamı değiştirin.
Kotlin
// get the text as SpannedString so we can get the spans attached to the text val titleText = getText(R.string.title) as SpannedString // get all the annotation spans from the text val annotations = titleText.getSpans(0, titleText.length, Annotation::class.java) // create a copy of the title text as a SpannableString. // the constructor copies both the text and the spans. so we can add and remove spans val spannableString = SpannableString(titleText) // iterate through all the annotation spans for (annotation in annotations) { // look for the span with the key font if (annotation.key == "font") { val fontName = annotation.value // check the value associated to the annotation key if (fontName == "title_emphasis") { // create the typeface val typeface = getFontCompat(R.font.permanent_marker) // set the span at the same indices as the annotation spannableString.setSpan(CustomTypefaceSpan(typeface), titleText.getSpanStart(annotation), titleText.getSpanEnd(annotation), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) } } } // now, the spannableString contains both the annotation spans and the CustomTypefaceSpan styledText.text = spannableString
Java
// get the text as SpannedString so we can get the spans attached to the text SpannedString titleText = (SpannedString) getText(R.string.title); // get all the annotation spans from the text Annotation[] annotations = titleText.getSpans(0, titleText.length(), Annotation.class); // create a copy of the title text as a SpannableString. // the constructor copies both the text and the spans. so we can add and remove spans SpannableString spannableString = new SpannableString(titleText); // iterate through all the annotation spans for (Annotation annotation: annotations) { // look for the span with the key font if (annotation.getKey().equals("font")) { String fontName = annotation.getValue(); // check the value associated to the annotation key if (fontName.equals("title_emphasis")) { // create the typeface Typeface typeface = ResourcesCompat.getFont(this, R.font.roboto_mono); // set the span at the same indices as the annotation spannableString.setSpan(new CustomTypefaceSpan(typeface), titleText.getSpanStart(annotation), titleText.getSpanEnd(annotation), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } } // now, the spannableString contains both the annotation spans and the CustomTypefaceSpan styledText.text = spannableString;
Aynı metni birden çok kez kullanıyorsanız olası performans ve bellek sorunlarını önlemek için SpannableString nesnesini bir kez oluşturmanız ve gerektiğinde yeniden kullanmanız gerekir.
Ek açıklama kullanımıyla ilgili daha fazla örnek için Android'de uluslararasılaştırılmış metnin stilini belirleme bölümüne bakın
Ek açıklama aralıkları ve metin paketleme
Annotation
aralıkları da ParcelableSpans
olduğundan anahtar/değer çiftleri ayrıştırılır ve ayrıştırılmaz. Paketin alıcısı notları nasıl yorumlayacağını bildiği sürece, Annotation
aralıklarını kullanarak paketlenmiş metne özel stiller uygulayabilirsiniz.
Metni bir Amaç Paketi'ne ilettiğinizde özel stilinizi korumak için öncelikle metninize Annotation
aralıkları eklemeniz gerekir. Bu işlemi, yukarıdaki örnekte gösterildiği gibi XML kaynaklarında <annotation> etiketi aracılığıyla veya aşağıda gösterildiği gibi yeni bir Annotation
oluşturup span olarak ayarlayarak kod içinde yapabilirsiniz:
Kotlin
val spannableString = SpannableString("My spantastic text") val annotation = Annotation("font", "title_emphasis") spannableString.setSpan(annotation, 3, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) // start Activity with text with spans val intent = Intent(this, MainActivity::class.java) intent.putExtra(TEXT_EXTRA, spannableString) startActivity(intent)
Java
SpannableString spannableString = new SpannableString("My spantastic text"); Annotation annotation = new Annotation("font", "title_emphasis"); spannableString.setSpan(annotation, 3, 7, 33); // start Activity with text with spans Intent intent = new Intent(this, MainActivity.class); intent.putExtra(TEXT_EXTRA, spannableString); this.startActivity(intent);
Metni Bundle
kaynağından SpannableString
olarak alın ve ardından yukarıdaki örnekte gösterildiği gibi ekli ek açıklamaları ayrıştırın.
Kotlin
// read text with Spans val intentCharSequence = intent.getCharSequenceExtra(TEXT_EXTRA) as SpannableString
Java
// read text with Spans SpannableString intentCharSequence = (SpannableString)intent.getCharSequenceExtra(TEXT_EXTRA);
Metin biçimlendirme hakkında daha fazla bilgi için aşağıdaki bağlantılara bakın: