Dize kaynakları

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> öğesinin name 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:
<resources>
Zorunlu. Bu, kök düğüm olmalıdır.

Özellik yok.

<string>
Stil etiketlerini içerebilen bir dize. Kesme işaretlerini ve tırnak işaretlerini kullanmaktan kaçınmalısınız. Dizelerinizi doğru şekilde nasıl biçimlendireceğiniz ve biçimlendireceğiniz hakkında daha fazla bilgi için aşağıdaki Biçimlendirme ve Biçimlendirme konusuna bakın.

özellikler:

name
Dize. Dizenin adı. Bu ad, kaynak kimliği olarak kullanılır.
ö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:

Kotlin

val string: String = getString(R.string.hello)

Java

String string = getString(R.string.hello);

Bir dizeyi almak için getString(int) veya getText(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> öğesinin name 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:
<resources>
Zorunlu. Bu, kök düğüm olmalıdır.

Özellik yok.

<string-array>
Dize dizisi tanımlar. Bir veya daha fazla <item> öğesi içerir.

özellikler:

name
Dize. Dizi için bir ad. Bu ad, diziye referansta bulunmak için kaynak kimliği olarak kullanılır.
<item>
Stil etiketlerini içerebilen bir dize. Değer, başka bir dize kaynağına başvuru olabilir. Bir <string-array> öğesinin alt öğesi olmalıdır. Kesme işaretlerini ve tırnak işaretlerini kullanmaktan kaçınmalısınız. Dizelerinizi doğru bir şekilde biçimlendirme ve biçimlendirme hakkında bilgi edinmek için aşağıdaki Biçimlendirme ve Biçimlendirme bölümüne bakın.

Özellik yok.

ö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> öğesinin name 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:
<resources>
Zorunlu. Bu, kök düğüm olmalıdır.

Özellik yok.

<plurals>
Bir dizenin miktarına bağlı olarak bir dize sağlanır. Bir veya daha fazla <item> öğesi içerir.

özellikler:

name
Dize. Dize çifti için bir ad. Bu ad, kaynak kimliği olarak kullanılır.
<item>
Çoğul veya tekil bir dize. Değer, başka bir dize kaynağına başvuru olabilir. Bir <plurals> öğesinin alt öğesi olmalıdır. Kesme işareti ve tırnak işaretleri kullanmanıza dikkat edin. Dizelerinizi doğru bir şekilde biçimlendirme ve biçimlendirme hakkında bilgi için aşağıdaki Biçimlendirme ve Stil bölümüne bakın.

özellikler:

quantity
Anahtar kelime. Bu dizenin ne zaman kullanılması gerektiğini gösteren bir değerdir. Parantez içinde tam kapsamlı olmayan örneklerle geçerli değerler:
DeğerAçıklama
zeroDil, 0 rakamının özel olarak işlenmesini gerektirdiğinde (Arapça'da olduğu gibi).
oneDil, bir gibi sayıların özel olarak işlenmesini gerektirdiğinde (İngilizce ve diğer dillerdeki 1 rakamı gibi; Rusçada 1 ile biten ancak 11 ile bitmeyen tüm sayılar bu sınıfa dahildir).
twoDilde iki gibi sayılar için özel işlem yapılması gerektiğinde (Galce 2, Slovence 102).
fewDilde "küçük" sayıların (Çekçe'de 2, 3 ve 4 gibi ya da Lehçede 2, 3 veya 4 ile biten ancak 12, 13 veya 14 ile biten sayılar) özel olarak değerlendirilmesi gerektiğinde.
manyDil, "büyük" sayıların (Maltaca 11-99 ile biten sayılar) özel olarak işlenmesini gerektirdiğinde.
otherDil, belirli bir miktarın özel olarak işlenmesini gerektirmediğinde (Çince tüm sayılar veya İngilizce'deki 42 sayılar gibi).
ö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çeriyorsa count öğesini iki kez iletmeniz gerekir. Örneğin, %d songs found dizesi için ilk count parametresi uygun çoğul dizeyi seçer ve ikinci count parametresi %d yer tutucusuna eklenir. Çoğul dizeleriniz dize biçimlendirmesi içermiyorsa üçüncü parametreyi getQuantityString öğ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:

  • \'
  • Dizenin tamamını çift tırnak içine alın (örneğin, "This'll work")
Ç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> &#32; &#8200; &#8195;</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>" &#32; &#8200; &#8195;"</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>&quot;Test this&quot;</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 ve sans_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:

  1. Stilize edilmiş metin kaynağınızı HTML çıkış karakterli dize olarak depolayın:
    <resources>
      <string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>
    </resources>
    

    Bu biçimlendirilmiş dizeye bir <b> öğesi eklenir. Açılış ayracının &lt; gösterimi kullanılarak HTML çıkışlı olduğuna dikkat edin.

  2. 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

  1. <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>
    
  2. 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: