Emoji Uyumluluğu

EmojiCompat destek kitaplığı, Android cihazları en yeni emojilerle güncel tutmayı amaçlar. Uygulamanızın eksik emoji karakterlerini ☐ biçiminde göstermesini engeller. Bu durum, cihazınızda metni görüntüleyecek bir yazı tipi olmadığını belirtir. EmojiCompat destek kitaplığını kullanarak uygulama kullanıcılarınızın en yeni emojileri edinmek için Android OS güncellemelerini beklemesine gerek kalmaz.

Emoji gösteren cihazlar
Şekil 1. Emoji karşılaştırması

Aşağıdaki ilgili kaynaklara bakın:

EmojiCompat nasıl çalışır?

EmojiCompat destek kitaplığı, Android 4.4 (API düzeyi 19) ve sonraki sürümleri çalıştıran cihazlarda geriye dönük uyumlu emoji desteğini uygulayabileceğiniz sınıflar sunar. EmojiCompat öğesini, paket halinde sunulan veya indirilebilir yazı tipleriyle yapılandırabilirsiniz. Yapılandırma hakkında daha fazla bilgi için aşağıdaki bölümlere bakın:

EmojiCompat, belirli bir CharSequence için emojileri tanımlar, gerekirse EmojiSpans ile değiştirir ve son olarak emoji gliflerini oluşturur. Şekil 2'de işlem gösterilmiştir.

EmojiCompat işlemi
Şekil 2. EmojiCompat işlemi

İndirilebilir yazı tipleri yapılandırması

İndirilebilir yazı tipleri yapılandırması, emoji yazı tipi indirmek için İndirilebilir Yazı Tipleri destek kitaplığı özelliğini kullanır. Ayrıca, EmojiCompat destek kitaplığının Unicode spesifikasyonunun en son sürümlerine uyum sağlamak için ihtiyaç duyduğu emoji meta verilerini de günceller.

Destek kitaplığı bağımlılığı ekleme

EmojiCompat destek kitaplığını kullanmak için geliştirme ortamınızda uygulama projenizin sınıf yolu bağımlılıklarını değiştirmeniz gerekir.

Uygulama projenize destek kitaplığı eklemek için:

  1. Uygulamanızın build.gradle dosyasını açın.
  2. dependencies bölümüne destek kitaplığını ekleyin.

Eski

dependencies {
    ...
    implementation "androidx.emoji:emoji:28.0.0"
}

Kotlin

dependencies {
    ...
    implementation("androidx.emoji:emoji:28.0.0")
}

İndirilebilir yazı tipi yapılandırmasını başlatma

Meta verileri ve yazı karakterini yüklemek için EmojiCompat öğesini ilk kullanıma hazırlamanız gerekir. Başlatma işlemi biraz zaman alabildiğinden, başlatma işlemi bir arka plan iş parçacığı üzerinde çalışır.

EmojiCompat öğesini indirilebilir yazı tipi yapılandırmasıyla başlatmak için aşağıdaki adımları uygulayın:

  1. FontRequest sınıfının bir örneğini oluşturun ve yazı tipi sağlayıcı yetkilisini, yazı tipi sağlayıcı paketini, yazı tipi sorgusunu ve sertifika için karma gruplarının listesini sağlayın. FontRequest hakkında daha fazla bilgi için İndirilebilir Yazı Tipleri dokümanlarındaki İndirilebilir Yazı Tiplerini programatik olarak kullanma bölümüne bakın.
  2. FontRequestEmojiCompatConfig örneği oluşturup Context ve FontRequest örneklerini sağlayın.
  3. init() yöntemini çağırıp FontRequestEmojiCompatConfig örneğini ileterek EmojiCompat özelliğini başlatın.
  4. Kotlin

    class MyApplication : Application() {
    
        override fun onCreate() {
            super.onCreate()
            val fontRequest = FontRequest(
                    "com.example.fontprovider",
                    "com.example",
                    "emoji compat Font Query",
                    CERTIFICATES
            )
            val config = FontRequestEmojiCompatConfig(this, fontRequest)
            EmojiCompat.init(config)
        }
    }
    

    Java

    public class MyApplication extends Application {
      @Override
       public void onCreate() {
         super.onCreate();
         FontRequest fontRequest = new FontRequest(
           "com.example.fontprovider",
           "com.example",
           "emoji compat Font Query",
           CERTIFICATES);
         EmojiCompat.Config config = new FontRequestEmojiCompatConfig(this, fontRequest);
         EmojiCompat.init(config);
       }
    }
    
  5. Düzen XML'lerinde EmojiCompat widget'larını kullanın. AppCompat kullanıyorsanız EmojiCompat widget'larını AppCompat ile kullanma bölümüne bakın.
  6. <android.support.text.emoji.widget.EmojiTextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    
    <android.support.text.emoji.widget.EmojiEditText
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    
    <android.support.text.emoji.widget.EmojiButton
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    

EmojiCompat öğesini indirilebilir yazı tipi yapılandırmasıyla yapılandırma hakkında daha fazla bilgi edinmek için Emoji Uyumluluğu örnek uygulaması Java | Kotlin bölümüne gidin.

Kitaplık bileşenleri

EmojiCompat işlemindeki kitaplık bileşenleri
Şekil 3. EmojiCompat işlemindeki kitaplık bileşenleri
Widget'lar: EmojiEditText, EmojiTextView, EmojiButton
EmojiCompat öğesini TextView, EditText ve Button ile kullanmak için varsayılan widget uygulamaları.
EmojiCompat
Destek kitaplığı için ana herkese açık yüzey. Tüm harici çağrıları ve koordinatları sistemin diğer bölümleriyle birlikte gerçekleştirir.
EmojiCompat.Config
Oluşturulacak singleton örneğini yapılandırır.
EmojiSpan
Karakterin (diziler) yerini alıp glifi oluşturan bir ReplacementSpan alt sınıfı.
EmojiCompat Yazı Tipi
EmojiCompat, emojileri görüntülemek için bir yazı tipi kullanıyor. Bu yazı tipi, Android Emoji yazı tipinin değiştirilmiş bir sürümüdür. Yazı tipi aşağıdaki gibi değiştirilir:
  • Emoji oluşturmak için geriye dönük uyumluluk sağlamak amacıyla, tüm emoji karakterleri Unicode'un Ek Özel Kullanım Alanı-A'sında U+F0001 ile başlayan tek bir Unicode kod noktasıyla gösterilir.
  • Ekstra emoji meta verileri, yazı tipine ikili program biçiminde eklenir ve çalışma zamanında EmojiCompat tarafından ayrıştırılır. Veriler, yazı tipinin meta tablosuna Emji gizli etiketiyle yerleştirilir.

Yapılandırma seçenekleri

EmojiCompat davranışını değiştirmek için EmojiCompat örneğini kullanabilirsiniz. Yapılandırmayı ayarlamak için temel sınıfta yer alan aşağıdaki yöntemleri kullanabilirsiniz:

Kotlin

val config = FontRequestEmojiCompatConfig(...)
        .setReplaceAll(true)
        .setEmojiSpanIndicatorEnabled(true)
        .setEmojiSpanIndicatorColor(Color.GREEN)
        .registerInitCallback(object: EmojiCompat.InitCallback() {
            ...
        })

Java

EmojiCompat.Config config = new FontRequestEmojiCompatConfig(...)
       .setReplaceAll(true)
       .setEmojiSpanIndicatorEnabled(true)
       .setEmojiSpanIndicatorColor(Color.GREEN)
       .registerInitCallback(new InitCallback() {...})

İlk kullanıma hazırlama işleyicileri ekleme

EmojiCompat ve EmojiCompat sınıfları, başlatma geri çağırması kaydetmek için registerInitCallback() ve unregisterInitCallback() yöntemleri sağlar. Bu yöntemleri kullanmak için EmojiCompat.InitCallback sınıfının bir örneğini oluşturun. Bu yöntemleri çağırın ve EmojiCompat.InitCallback sınıfının örneğini iletin. EmojiCompat destek kitaplığının başlatılması başarılı olduğunda EmojiCompat sınıfı onInitialized() yöntemini çağırır. Kitaplık başlatılamazsa EmojiCompat sınıfı onFailed() yöntemini çağırır.

Herhangi bir anda başlatma durumunu kontrol etmek için getLoadState() yöntemini çağırın. Şu değerlerden birini döndürür: LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED veya LOAD_STATE_FAILED.

EmojiCompat'ı AppCompat widget'larıyla kullanma

AppCompat widgets kullanıyorsanız AppCompat widgets tarihinden itibaren genişletilmiş EmojiCompat widget'ları kullanabilirsiniz.

  1. Bağımlılıklar bölümüne destek kitaplığını ekleyin.

    Eski

    dependencies {
        ...
        implementation "androidx.emoji:emoji-bundled:$version"
    }
    

    Kotlin

          dependencies {
              implementation("androidx.emoji:emoji-appcompat:$version")
          }
          

    Eski

          dependencies {
              implementation "androidx.emoji:emoji-appcompat:$version"
          }
          
  2. Düzen XML'lerinde EmojiCompat AppCompat Widget widget'larını kullanın.
  3. <android.support.text.emoji.widget.EmojiAppCompatTextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    
    <android.support.text.emoji.widget.EmojiAppCompatEditText
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    
    <android.support.text.emoji.widget.EmojiAppCompatButton
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    

Gruplandırılmış yazı tiplerini yapılandırma

EmojiCompat destek kitaplığı, yazı tipiyle birlikte paket halinde de mevcuttur. Bu paket, yerleştirilmiş meta verilerin bulunduğu yazı tipini içerir. Paket, meta verileri ve yazı tiplerini yüklemek için AssetManager kullanan bir BundledEmojiCompatConfig de içerir.

Not: Yazı tipi boyutu birden fazla megabayttır.

Destek kitaplığı bağımlılığı ekleme

EmojiCompat destek kitaplığını gruplandırılmış yazı tipi yapılandırmasıyla kullanmak için geliştirme ortamınızda uygulama projenizin sınıf yolu bağımlılıklarını değiştirmeniz gerekir.

Uygulama projenize destek kitaplığı eklemek için:

  1. Uygulamanızın build.gradle dosyasını açın.
  2. dependencies bölümüne destek kitaplığını ekleyin.

Eski

dependencies {
    ...
    implementation "androidx.emoji:emoji:28.0.0"
}

Kotlin

dependencies {
    ...
    implementation("androidx.emoji:emoji:28.0.0")
}

EmojiCompat'ı yapılandırmak için gruplandırılmış yazı tiplerini kullanma

EmojiCompat eklentisini yapılandırmak için gruplandırılmış yazı tiplerini kullanmak için aşağıdaki adımları uygulayın:

  1. EmojiCompat örneği oluşturmak ve Context örneğini sağlamak için BundledEmojiCompatConfig kullanın.
  2. EmojiCompat öğesini başlatmak için init() yöntemini çağırın ve BundledEmojiCompatConfig örneğini iletin.

Kotlin

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        val config = BundledEmojiCompatConfig(this)
        EmojiCompat.init(config)
    }
}

Java

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        EmojiCompat.Config config = new BundledEmojiCompatConfig(this);
        EmojiCompat.init(config);
        ...
    }
}

EmojiCompat'ı widget'lar olmadan kullanma

EmojiCompat, doğru resimleri oluşturmak için EmojiSpan özelliğini kullanır. Bu nedenle, belirli bir CharSequence öğesini EmojiSpans ile Spanned örneklerine dönüştürmesi gerekir. EmojiCompat sınıfı, CharSequences öğesini EmojiSpans ile Spanned örneklerine dönüştürmek için bir yöntem sağlar. Bu yöntemi kullanarak, ham dize yerine işlenen örnekleri işleyip önbelleğe alabilirsiniz. Bu, uygulamanızın performansını artırır.

Kotlin

val processed = EmojiCompat.get().process("neutral face \uD83D\uDE10")

Java

CharSequence processed = EmojiCompat.get().process("neutral face \uD83D\uDE10");

IME'ler için EmojiCompat'ı kullanma

Klavyeler, EmojiCompat destek kitaplığını kullanarak etkileşimde bulundukları uygulama tarafından desteklenen emojileri oluşturabilir. IME'ler, EmojiCompat öğesinin emoji oluşturup oluşturamadığını kontrol etmek için hasEmojiGlyph() yöntemini kullanabilir. Bu yöntem, bir emojinin CharSequence kadarını alır ve EmojiCompat emojiyi algılayıp oluşturabiliyorsa true değerini döndürür.

Palette hangi emojinin oluşturulacağını belirlemek için klavye, uygulamanın desteklediği EmojiCompat destek kitaplığı sürümünü de kontrol edebilir. Varsa klavyenin, sürümü kontrol etmek için EditorInfo.extras paketinde aşağıdaki tuşların olup olmadığını kontrol etmesi gerekir:

EditorInfo.extras paketindeki tuşları aldıktan sonra klavye, uygulamanın belirli bir emoji oluşturup oluşturamayacağını kontrol etmek için hasEmojiGlyph() yöntemini kullanabilir. Burada metadataVersion, EDITOR_INFO_METAVERSION_KEY değeridir.

EmojiCompat'ı özel widget'larla kullanma

Uygulamanızda CharSequence öğesini önceden işlemek ve Spanned örneklerini oluşturabilen herhangi bir widget'a (ör. TextView) eklemek için her zaman process() yöntemini kullanabilirsiniz. Ayrıca EmojiCompat, özel widget'larınızı emoji desteğiyle minimum çabayla zenginleştirmenizi sağlamak için aşağıdaki widget yardımcı sınıflarını da sunar.

Örnek TextView

Kotlin

class MyTextView(context: Context) : AppCompatTextView(context) {

    private val emojiTextViewHelper: EmojiTextViewHelper by lazy(LazyThreadSafetyMode.NONE) {
        EmojiTextViewHelper(this).apply {
            updateTransformationMethod()
        }
    }

    override fun setFilters(filters: Array<InputFilter>) {
        super.setFilters(emojiTextViewHelper.getFilters(filters))
    }

    override fun setAllCaps(allCaps: Boolean) {
        super.setAllCaps(allCaps)
        emojiTextViewHelper.setAllCaps(allCaps)
    }
}

Java

public class MyTextView extends AppCompatTextView {
   ...
   public MyTextView(Context context) {
       super(context);
       init();
   }
   ...
   private void init() {
       getEmojiTextViewHelper().updateTransformationMethod();
   }

   @Override
   public void setFilters(InputFilter[] filters) {
       super.setFilters(getEmojiTextViewHelper().getFilters(filters));
   }

   @Override
   public void setAllCaps(boolean allCaps) {
       super.setAllCaps(allCaps);
       getEmojiTextViewHelper().setAllCaps(allCaps);
   }

   private EmojiTextViewHelper getEmojiTextViewHelper() {
       ...
   }
}
Örnek EditText

Kotlin

class MyEditText(context: Context) : AppCompatEditText(context) {

    private val emojiEditTextHelper: EmojiEditTextHelper by lazy(LazyThreadSafetyMode.NONE) {
        EmojiEditTextHelper(this).also {
            super.setKeyListener(it.getKeyListener(keyListener))
        }
    }

    override fun setKeyListener(input: KeyListener?) {
        input?.also {
            super.setKeyListener(emojiEditTextHelper.getKeyListener(it))
        }
    }

    override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection {
        val inputConnection: InputConnection = super.onCreateInputConnection(outAttrs)
        return emojiEditTextHelper.onCreateInputConnection(
                inputConnection,
                outAttrs
        ) as InputConnection
    }
}

Java

public class MyEditText extends AppCompatEditText {
   ...
   public MyEditText(Context context) {
       super(context);
       init();
   }
   ...
   private void init() {
       super.setKeyListener(getEmojiEditTextHelper().getKeyListener(getKeyListener()));
   }

   @Override
   public void setKeyListener(android.text.method.KeyListener keyListener) {
       super.setKeyListener(getEmojiEditTextHelper().getKeyListener(keyListener));
   }

   @Override
   public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
       InputConnection inputConnection = super.onCreateInputConnection(outAttrs);
       return getEmojiEditTextHelper().onCreateInputConnection(inputConnection, outAttrs);
   }

   private EmojiEditTextHelper getEmojiEditTextHelper() {
       ...
   }
}

Sık sorulan sorular

  • Yazı tipi indirme işlemini nasıl başlatabilirim?
  • Cihazda yoksa emoji yazı tipleri ilk istek üzerine indirilir. İndirme planlaması uygulama için şeffaftır.

  • İlk kullanıma hazırlama ne kadar sürer?
  • Yazı tipi indirildikten sonra EmojiCompat ürününün ilk kullanıma hazırlanması yaklaşık 150 milisaniye sürer.

  • EmojiCompat destek kitaplığı ne kadar bellek kullanıyor?
  • Şu anda, emojiyi bulmak için kullanılan veri yapısı, uygulamanın belleğine yüklenmiştir ve yaklaşık 200 KB kullanır.

  • EmojiCompat'ı özel bir TextView için kullanabilir miyim?
  • Evet. EmojiCompat, özel widget'lar için yardımcı sınıflar sağlar. Belirli bir dizeyi önceden işleyip Spanned biçimine dönüştürmek de mümkündür. Widget yardımcı sınıfları hakkında daha fazla bilgi için EmojiCompat'ı özel widget'larla kullanma bölümüne bakın.

  • Android 4.4 (API düzeyi 19) veya önceki sürümleri çalıştıran cihazlarda düzen XML'lerine widget eklersem ne olur?
  • Android 4.4 (API düzeyi 19) veya önceki sürümleri çalıştıran cihazları destekleyen uygulamalarınıza EmojiCompat destek kitaplığını veya widget'larını ekleyebilirsiniz. Ancak cihaz, API düzeyi 19'dan önceki bir Android sürümünü kullanıyorsa EmojiCompat ve widget'ları "çalışmıyor" durumunda olur. Yani EmojiTextView, tıpkı normal bir TextView gibi davranır. EmojiCompat örneği; init() yöntemini çağırdığınızda anında LOAD_STATE_SUCCEEDED durumuna geçer.

Ek kaynaklar

EmojiCompat kitaplığını kullanma hakkında ek bilgi için EmojiCompat videosunu izleyin.