Dize kaynakları

Dize kaynağı, uygulamanız için metin dizeleri sağlar isteğe bağlı metin stili ve biçimlendirme ile. Size sunabileceğiniz üç tür kaynak vardır: aşağıdaki adımları uygulayın:

String
Tek bir dize sağlayan XML kaynağı.
Dize Dizisi
Dize dizisi sağlayan XML kaynağı.
Miktar Dizeleri (Çoğunlukla)
Ç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şkenlerini uygulayabilir. Örneğin, dizeleri biçimlendirme ve biçimlendirme hakkında bilgi edinmek için Biçimlendirme ve Stil bölümüne bakın.

Dize

Uygulamadan veya diğer kaynak dosyalarından ( kullanabilirsiniz.

Not: Dize, başvurulan basit bir kaynaktır (XML dosyasının adı değil) name özelliğinde sağlanan değeri kullanarak. Böylece siz de tek bir XML dosyasında dize kaynaklarını diğer basit kaynaklarla birleştirir. bir <resources> öğesinin altında.

dosya konumu:
res/values/filename.xml

Dosya adı rastgele seçilmiştir. <string> öğesinin name, kaynak kimliği.
derlenen kaynak veri türü:
Kaynak işaretçisi bir String.
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 etiketleri içerebilen bir dize. Kesme işaretlerinden ve bu tür metinlerin Tırnak işaretleri. Dizelerinizi doğru şekilde biçimlendirme ve biçimlendirme hakkında daha fazla bilgi için aşağıdaki Biçimlendirme ve Stil bölümüne bakın.

özellikler:

name
Dize. Dizenin adı. Bu ad kaynak olarak kullanılıyor Kimlik.
örnek:
XML dosyası res/values/strings.xml itibarıyla kaydedildi:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello!</string>
</resources>

Bu düzen XML'i, 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);

getString(int) veya Dize almak için getText(int). getText(int), dizeye uygulanan tüm zengin metin stillerini korur.

Dize dizisi

Uygulamadan başvurulabilecek bir dize dizisi.

Not: Dize dizisi, referans verilen basit bir kaynaktır (XML dosyasının adı değil) name özelliğinde sağlanan değeri kullanarak. Farklı dize dizisi kaynaklarını diğer basit kaynaklarla tek bir XML dosyasında birleştirebilirsiniz. bir <resources> öğesinin altında.

dosya konumu:
res/values/filename.xml

Dosya adı rastgele seçilmiştir. <string-array> öğesinin name, kaynak kimliği.
derlenen kaynak veri türü:
Kaynak işaretçisi String dizisinden oluşur.
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 adı. Bu ad kaynak olarak kullanılıyor Diziye referans veren kimlik.
<item>
Stil etiketleri içerebilen bir dize. Değer, başka bir öğeye referans olabilir dize kaynağı. Bir <string-array> öğesinin alt öğesi olmalıdır. Dikkatli olun: kesme işaretinden ve Tırnak işaretleri. Aşağıdaki Biçimlendirme ve Stil bölümünde dizelerinizi doğru şekilde biçimlendirme ve biçimlendirme hakkında bilgi edinin.

Özellik yok.

örnek:
XML dosyası res/values/strings.xml itibarıyla 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)

Farklı dillerin, miktarla dil bilgisi anlaşması için farklı kuralları vardır. İngilizcede Örneğin, miktar 1 özel bir durumdur. "1 kitap" yazıyoruz, ancak diğer miktarlar için "n kitap" yazın. Tekil ve çoğul arasındaki bu ayrım çok yaygındır, ancak daha hassas ayrımlar yapar. Android tarafından desteklenen tam set zero şeklindedir. one, two, few, many ve other.

Belirli bir dil ve miktar için hangi olgunun kullanılacağına karar vermeye yönelik kurallar çok karmaşık olabilir. Android size Seçmek için getQuantityString() bir yöntem belirleyin.

Eskiden "miktar dizeleri" olarak adlandırılsa da (ve API'de de buna hâlâ çağrılıyor), miktar dizeler yalnızca çoğullar için kullanılmalıdır. Tutarsızlık dizeleri kullanarak Gmail'in "Gelen Kutusu" veya herhangi bir web ile "Gelen Kutusu (12)" karşılaştırması okunmamış iletiler olduğunda örneğine bakalım. if ifadesi yerine miktar dizeleri kullanmak daha uygun görünebilir. ancak bazı dillerde (ör. Çince) bu dilin dilbilgisi kurallarına hiçbir ayrım yoktur. Dolayısıyla her zaman other dizesini elde edersiniz.

Kullanılacak dize seçimi, yalnızca dil bilgisinin gerekliliğine göre yapılır. İngilizcede miktar 0 olsa bile zero dizesi yoksayılır çünkü 0 dil bilgisi olarak 2'den veya 1 ("sıfır kitap", "bir kitap", "iki kitap" vb.) kullanın. Buna karşılık, yalnızca Korecede other dizesi emin olabilirsiniz.

Örneğin, two teriminin yalnızca bu anahtar kelime için geçerli miktar 2: bir dilde 2, 12, 102 (vb.) tek bir sayı gibi ele alınmasını gerektirebilir ama diğer miktarlardan farklıdır. Hangi farklılıkların olduğunu bilmek için çevirmeninize güvenin konusunda ısrarcı olabilir.

İletiniz miktar numarasını içermiyorsa, büyük olasılıkla şuna ilişkin iyi bir aday değildir: çoğul. Örneğin, Litvancada hem 1 hem de 101 için tekil biçim kullanılır. Dolayısıyla "1 kitap" : "1 knyga" ve "101 kitap" olarak çevrildi. "101 knyga" olarak çevrilir. Aynı zamanda "bir kitap" "knyga" mı? ve "birçok kitap" değeri "daug knyg↘" şeklindedir. İngilizce çoğul bir mesajda "bir kitap" söz konusuysa (tekil) ve "birçok kitap" (çoğul) olmadan gerçek sayı, "knyga" şeklinde çevrilebilir. (kitap)/"daug knyg↘" (birçok kitap), ancak Litvanca kurallarında "knyga" ifadesi gösterilir (tek bir kitap), sayı 101 olduğunda.

Çoğu zaman, "Kitaplar: 1". Böylece, hem hayatınız hem de çevirmenleriniz uygulamanız için kabul edilebilir bir stil olduğunda, hayatınızı kolaylaştırır.

API 24 ve sonraki sürümlerde çok daha güçlü olan ICU MessageFormat'yı kullanabilirsiniz. sınıfını kullanır.

Not: Çoğullar koleksiyonu, name özelliğinde (XML'in adı değil) sağlanan değer kullanılarak referans verildi dosyası) ekleyebilirsiniz. Bu nedenle, çoğul kaynakları diğer basit kaynaklarla bir arada kullanabilirsiniz. XML dosyası, bir <resources> öğesinin altında.

dosya konumu:
res/values/filename.xml

Dosya adı rastgele seçilmiştir. <plurals> öğesinin name, kaynak kimliği.
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 dize koleksiyonuna bağlı olarak bir şey yok. Bir veya daha fazla <item> öğesi içerir.

özellikler:

name
Dize. Dize çiftinin adı. Bu ad şu şekilde kullanılıyor: kaynak kimliği.
<item>
Çoğul veya tekil dize. Değer, başka bir öğeye referans olabilir dize kaynağı. Bir <plurals> öğesinin alt öğesi olmalıdır. Dikkat etmeniz gereken kesme işaretlerini ve tırnak işaretlerini kod dışına alabilirsiniz. Biçimlendirme ve Stil bölümüne bakın.

özellikler:

quantity
Anahtar kelime. Bu dizenin ne zaman kullanılması gerektiğini gösteren değer. Geçerli (listede olası her duruma yer verilmemiştir; parantez içinde örneklerle birlikte):
DeğerAçıklama
zeroDilde 0 sayısının özel olarak işlenmesi gerektiğinde (Arapçada olduğu gibi).
oneDilde bir gibi özel işlemlerin yapılması gerektiğinde (İngilizce'deki 1 sayısı ve diğer dillerin çoğunda olduğu gibi, Rusçada 1 ile biten ancak 11 ile bitmeyen sayılar bu sınıfta yer alır).
twoDilde iki gibi özel işlemlerin yapılmasını gerektirdiğinde (Galcede 2, Slovence'de 102'de olduğu gibi).
fewDil, "küçük" kelimesinin özel olarak ele alınmasını gerektirdiğinde sayılar (Çekçe'de 2, 3 ve 4'te olduğu gibi; Lehçede 12, 13 veya 14 ile biten ancak 2, 3 veya 4 ile biten sayılar).
manyDil için "büyük" şeklinde özel işlem yapılması gerektiğinde sayılar (Maltaca'da 11-99 arasında olan sayılar gibi).
otherDilde, belirtilen miktar için özel işlem gerekmiyorsa (Çince tüm sayılarda veya İngilizcede 42'de olduğu gibi).
örnek:
XML dosyası res/values/strings.xml itibarıyla 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 itibarıyla 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 şunu içeriyorsa count yöntemini iki kez iletmeniz gerekir: dize biçimlendirmesi değerini kullanın. Örneğin, %d songs found, ilk count parametresi uygun çoğul dizeyi seçer ve ikinci count parametresi %d yer tutucusuna eklenir. Çoğul dizeler dize biçimlendirmesi içermez. Üçüncü parametreyi getQuantityString öğesine aktarmanız gerekmez.

Biçim ve stil

Nasıl doğru şekilde iletişim kuracağınızla ilgili bilmeniz gereken dize kaynaklarınızı biçimlendirin ve stillerini belirleyin.

Özel karakterleri kullanma

Bir dize XML'de özel kullanım olan karakterler içerdiğinde karakterlerinin standart XML/HTML çıkış kurallarına göre ayarlanması gerekir. Bir karakterden kaçınmanız gerekirse başına ters eğik çizgi eklemeniz önerilir.

Android, varsayılan olarak boşluk karakteri dizilerini tek bir boşluk olacak şekilde daraltır. Dizenizin ilgili bölümünü çift tırnak içine alarak bunu önleyebilirsiniz. Bu durumda tüm boşluk karakterleri (yeni satırlar dahil) tırnak işareti içinde korunur. Çift tırnak işareti, normal tek çıkış karaktersiz tırnak işareti de kullanmanıza olanak tanır.

Karakter Çıkış karakterli formlar
@ \@
? \?
Yeni satır \n
Sekme \t
U+XXXX Unicode karakteri \uXXXX
Tek tırnak işareti (')

Şunlardan herhangi biri:

  • \'
  • Dizenin tamamını çift tırnak içine alın (örneğin "This'll work")
Çift tırnak işareti (") \"

Dizeyi tek tırnak işareti içine almanın işe yaramadığını unutmayın.

Boşlukların daraltılması ve Android'e çıkış, kaynak dosyası XML olarak ayrıştırılır. Bunun anlamı, <string> &#32; &#8200; &#8195;</string>. (boşluk, noktalama boşluğu, Unicode Em boşluk) tek bir boşluk olacak şekilde daraltılır (" ") çünkü dosya XML olarak ayrıştırıldıktan sonraki tüm Unicode boşluklarıdır. Bu alanları olduğu gibi korumak için alıntı yapabilirsiniz. (<string>" &#32; &#8200; &#8195;"</string>) veya Android kaçış özelliğini kullanın. (<string> \u0032 \u8200 \u8195</string>).

Not: XML ayrıştırıcısının bakış açısından, <string>"Test this"</string> ve Sonuç olarak <string>&quot;Test this&quot;</string>. Her iki form tırnak işareti göstermez ancak Android boşluklarını koruyan alıntılama işlemini tetikler ( uygulamalı etki).

Dizeleri biçimlendirme

Dizelerinizi biçimlendirmeniz gerekiyorsa bunu, biçim bağımsız değişkenlerinizi dize kaynağına koyarak yapabilirsiniz. aşağıdaki örnek kaynakta gösterildiği gibidir.

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

Bu örnekte, biçim dizesinde iki bağımsız değişken vardır: %1$s bir dizedir, %2$d ondalık bir sayıdır. Ardından getString(int, Object...) yöntemini çağırarak dizeyi biçimlendirin. Örnek:

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. Örnek:

<?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>, <citation>, <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”>. Örnekler Olası yazı tipi aileleri şunlardır: monospace, serif ve sans_serif.
  • Tek aralıklı yazı tipi ailesi ayarlama: <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) Ancak bazı durumlarda, biçim dizesi olarak da kullanılan stilize edilmiş bir metin kaynağı oluşturmak istiyorsunuz. Normalde bu çalışmaz çünkü format(String, Object...) ve getString(int, Object...) yöntemi tüm stilleri ayıklar bilgi ekler. Bu sorunun geçici çözümü, HTML etiketlerini çıkış karakterli ve daha sonra fromHtml(String) ile kurtarılan öğeler, işlem yapılır. Örnek:

  1. Stil özellikleri ayarlanmış metin kaynağınızı HTML çıkışlı 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ış parantezinin &lt; gösterimini kullanarak HTML çıkış karakterli.

  2. Daha sonra dizeyi her zamanki gibi biçimlendirin ama aynı zamanda fromHtml(String) HTML metnini stil özellikli metne dönüştü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ği için biçimlendirilmiş metinle kullandığınız dizelerde olası HTML karakterlerini kod dışına almak için htmlEncode(String). Örneğin, "<" veya "&" içeriyorsa bunlar biçimlendirmeden önce kod dışına alınmalıdır. Böylece, biçimlendirilmiş dize fromHtml(String) üzerinden geçildiğinde, karakterler eskileri gibi çıkıyor yazarlar. Örnek:

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);

Spanable'larla stil belirleme

Spannable, stilini belirleyebileceğiniz bir metin nesnesidir renk ve yazı tipi genişliği gibi yazı karakteri özellikleri hakkında bilgi edindiniz. Kullandığınız Derlemek için SpannableStringBuilder metninize ekleyebilirsiniz ve ardından android.text.style paketine ekler.

İşin büyük bir kısmını ayarlamak için aşağıdaki yardımcı yöntemleri kullanabilirsiniz bir örnek:

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);
        }
    }
}

Takip eden bold, italic ve color Yöntemleri, yukarıdaki yardımcı yöntemleri sarmalar ve uygulama ile ilgili spesifik örnekleri gösterir stil android.text.style paketinde tanımlandı. Siz diğer metin biçimlendirme türleri için benzer yöntemler oluşturabilir.

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, her bir reklam grubuna çeşitli stiller uygulamak için bu yöntemlerin nasıl zincir bir kelime öbeği içindeki kelimeler:

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 kolay olur. Web sitemiz g.co/newsinitiative/labs üzerinden Daha fazla bilgi edinmek için GitHub'daki android.text paketi dokümanlarına göz atın.

Aralıklarla çalışma hakkında daha fazla bilgi için aşağıdaki bağlantılara bakın:

Ek açıklamalarla stil belirleme

Şunlarla birlikte Annotation sınıfını kullanarak karmaşık veya özel stil uygulayabilirsiniz: string.xml kaynak dosyalarınızda <annotation> etiketi. Ek açıklama etiketi, XML'de özel anahtar/değer çiftleri tanımlayarak dizenin bölümlerini özel stil için işaretlemenize olanak tanır daha sonra çerçevenin Annotation aralıklarına dönüştüğünü gösterir. Daha sonra bu görevleri anahtarı ve değeri kullanarak stili uygulayabilirsiniz.

Ek açıklama oluştururken <annotation> eklediğinizden emin olun etiketini her string.xml dosyasındaki dizenin tüm çevirilerine ekler.


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 durumda, anahtarı font ve değer de 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 anahtarıyla ek açıklamaları bulun. Daha sonra, yeni bir özel aralığı kullanın ve 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 SpannableString nesnesini bir kez kullanıp olası performansı ve belleği önlemek için gerektiğinde yeniden kullanın sorunları.

Ek açıklama kullanımıyla ilgili daha fazla örnek için bkz. Android'de uluslararası metinlere stil ekleme

Ek açıklama aralıkları ve metin ayrıştırma

Annotation aralıkları da ParcelableSpans olduğundan anahtar/değer çifti çiftler ayrıştırılır ve ayrıştırılmaz. Kargonun alıcısı nasıl yorumlanacağını bildiği sürece ek açıklamalara özel stil uygulamak için Annotation kapsamlarını kullanabilirsiniz ayrıştırılmış metin.

Metni bir Intent Bundle'a ilettiğinizde özel stilinizi korumak için öncelikle Annotation, metninizi kapsar. Bunu XML kaynaklarında <not> etiketine (yukarıdaki örnekte gösterildiği gibi) veya yeni bir Annotation ve aşağıda gösterildiği gibi bir aralık olarak ayarlamak için:

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);

Bundle kaynağından metni SpannableString olarak al ve sonra ayrıştır Yukarıdaki örnekte gösterildiği gibi, ekli ek açıklamalar.

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: