Compatibilità con emoji

La raccolta di assistenza di EmojiCompat mira a mantenere i dispositivi Android aggiornati con le ultime emoji. Impedisce alla tua app non mostri emoji mancanti sotto forma di ☐, che indica che il dispositivo non ha un carattere per visualizzare il testo. Di usando la libreria di supporto EmojiCompat. gli utenti dell'app non devono attendere gli aggiornamenti del sistema operativo Android per ricevere la versione più recente emoji.

Dispositivi che mostrano emoji
Figura 1. Confronto di emoji
.

Consulta le seguenti risorse correlate:

  • Esempio di app per la compatibilità di emoji Java | Kotlin

Come funziona EmojiCompat?

La libreria di assistenza EmojiCompat offre per implementare il supporto di emoji compatibili con le versioni precedenti sui dispositivi Android 4.4 (livello API 19) e versioni successive. Puoi configurare EmojiCompat con bundle o caratteri scaricabili. Per saperne di più sulla configurazione, consulta sezioni seguenti:

EmojiCompat identifica l'emoji per un determinato CharSequence, lo sostituisce con EmojiSpans, se necessario, e esegue il rendering dei glifi delle emoji. La figura 2 illustra il processo.

Procedura EmojiCompat
Figura 2. Procedura EmojiCompat
.

Configurazione dei caratteri scaricabili

La configurazione dei caratteri scaricabili utilizza il supporto per i caratteri scaricabili funzionalità della raccolta per scaricare un carattere delle emoji. Inoltre, aggiorna le metadati delle emoji che EmojiCompat la libreria di supporto deve stare al passo con le versioni più recenti dell'Unicode e la specifica del prodotto.

Aggiunta della dipendenza dalla libreria di supporto

Per utilizzare la libreria di assistenza EmojiCompat: devi modificare le dipendenze classpath del progetto dell'app all'interno di sviluppo software.

Per aggiungere una libreria di supporto al progetto dell'applicazione:

  1. Apri il file build.gradle della tua applicazione.
  2. Aggiungi la libreria di supporto alla sezione dependencies.

Alla moda

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

Kotlin

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

Inizializzazione del carattere scaricabile configurazione

Devi inizializzare EmojiCompat in caricare i metadati e il carattere tipografico. Poiché l'inizializzazione può richiedere del tempo, il processo di inizializzazione viene eseguito su un thread in background.

Per inizializzare EmojiCompat con configurazione del carattere scaricabile, procedi nel seguente modo:

  1. Crea un'istanza di FontRequest e specifica l'autorità del provider del font, il pacchetto del provider del font, la query sul carattere e un elenco di set di hash per il certificato. Per ulteriori informazioni informazioni su FontRequest, consulta alle Utilizzo programmatico dei caratteri scaricabili nella sezione Caratteri scaricabili documentazione.
  2. Crea un'istanza di FontRequestEmojiCompatConfig e fornisce le istanze di Context e FontRequest.
  3. Inizializza EmojiCompat chiamando il metodo init() e passiamo l'istanza FontRequestEmojiCompatConfig.
  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. Usa i widget EmojiCompat nel layout XML. Se utilizzi AppCompat, consulta le Utilizzare i widget EmojiCompat con AppCompat .
  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"/>
    

Per ulteriori informazioni su come configurare EmojiCompat con il carattere scaricabile configurazione, vai all'app di esempio Compatibilità di emoji Java | Kotlin.

Componenti della libreria

Componenti della Raccolta nella procedura EmojiCompat
Figura 3. Componenti della Raccolta nella procedura EmojiCompat
.
.
Widget: EmojiEditText, EmojiTextView, EmojiButton
Implementazioni predefinite del widget da usare EmojiCompat con TextView, EditText e Button.
EmojiCompat
Piattaforma pubblica principale per la libreria di supporto. Esegue tutte le chiamate esterne e si coordina con le altre parti del sistema.
EmojiCompat.Config
Configura l'istanza singleton da creare.
EmojiSpan
Una sottoclasse ReplacementSpan che sostituisce (sequenze) e restituisce il glifo.
Carattere EmojiCompat
EmojiCompat utilizza un carattere per visualizzare emoji. Questo carattere è una versione modificata del Carattere Android Emoji. Il carattere viene modificato nel seguente modo:
  • Per garantire la compatibilità con le versioni precedenti del rendering delle emoji, tutte le emoji sono rappresentati da un singolo punto di codice Unicode Supplemental Private Use Area-A di Unicode che inizia con U+F0001.
  • Ulteriori metadati delle emoji vengono inseriti in formato binario nel carattere e viene analizzato in fase di runtime EmojiCompat. I dati sono incorporati nella tabella meta del carattere, con il tag privato Emji.

Opzioni di configurazione

Puoi utilizzare l'istanza EmojiCompat per modifica il comportamento di EmojiCompat. Puoi utilizzare utilizza i seguenti metodi dalla classe base per impostare la configurazione:

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() {...})

Aggiunta di listener di inizializzazione

EmojiCompat e EmojiCompat corso fornire registerInitCallback() e unregisterInitCallback() per registrare un callback di inizializzazione. Per utilizzare questi metodi, crea un'istanza EmojiCompat.InitCallback corso. Chiama questi metodi e passare l'istanza EmojiCompat.InitCallback corso. Quando inizializzazione del supporto EmojiCompat che ha successo, EmojiCompat chiama onInitialized() . Se la libreria non viene inizializzato, EmojiCompat chiama onFailed() .

Per controllare lo stato di inizializzazione in qualsiasi momento, richiama il metodo getLoadState() . Restituisce uno dei seguenti valori: LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED, o LOAD_STATE_FAILED.

Utilizzare EmojiCompat con i widget AppCompat

Se utilizzi AppCompat widgets, possono usare EmojiCompat widget che estendono da AppCompat widgets.

  1. Aggiungi la libreria di supporto alla sezione delle dipendenze.

    Alla moda

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

    Kotlin

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

    Alla moda

          dependencies {
              implementation "androidx.emoji:emoji-appcompat:$version"
          }
          
  2. Usa EmojiCompat Widget AppCompat Widget nel layout XML.
  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"/>
    

Configurazione dei caratteri in bundle

È disponibile anche la libreria di assistenza EmojiCompat disponibili in una versione integrata dei caratteri. Questo pacchetto include il font con metadati incorporati. Il pacchetto include anche BundledEmojiCompatConfig che utilizza AssetManager per caricare i metadati e i caratteri.

Nota: le dimensioni del carattere possono essere megabyte.

Aggiunta della dipendenza dalla libreria di supporto

Per utilizzare la libreria di assistenza EmojiCompat con la configurazione dei caratteri in bundle, devi modificare il codice delle dipendenze classpath nell'ambiente di sviluppo.

Per aggiungere una libreria di supporto al progetto dell'applicazione:

  1. Apri il file build.gradle della tua applicazione.
  2. Aggiungi la libreria di supporto alla sezione dependencies.

Alla moda

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

Kotlin

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

Utilizzare i caratteri raggruppati per configurare EmojiCompat

Per utilizzare i caratteri combinati per configurare EmojiCompat, segui questi passaggi:

  1. Usa BundledEmojiCompatConfig per creare un'istanza di EmojiCompat e fornire un'istanza di Context.
  2. Chiama il init() di inizializzazione EmojiCompat e passiamo l'istanza BundledEmojiCompatConfig.

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

Utilizzare EmojiCompat senza widget

EmojiCompat usi EmojiSpan per eseguire il rendering delle immagini corrette. Di conseguenza, deve convertire ogni dato CharSequence in Spanned istanze con EmojiSpans. La La classe EmojiCompat fornisce un metodo per converti CharSequences in Spanned istanze con EmojiSpans. Utilizzando questo metodo, puoi elaborare e memorizzare nella cache le istanze elaborate anziché la stringa non elaborata, migliorando così le prestazioni della tua applicazione.

Kotlin

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

Java

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

Utilizzo di EmojiCompat per gli IME

Tramite la libreria di assistenza di EmojiCompat, le tastiere possono mostrare l'emoji supportata dall'applicazione che stanno a interagire con loro. Gli IME possono utilizzare hasEmojiGlyph() per verificare se EmojiCompat è in grado di rendering di un'emoji. Questo metodo richiede un valore CharSequence un'emoji e restituisce true se EmojiCompat può rilevare e visualizzare emoji.

La tastiera può anche controllare la versione EmojiCompat supporta la raccolta che l'app consente di stabilire quali emoji visualizzare nella tavolozza. Per controllare dell'app, se disponibile, la tastiera deve controllare se quanto segue esistono EditorInfo.extras gruppo:

Dopo aver ricevuto i tasti nella EditorInfo.extras cofanetto, la tastiera può utilizzare hasEmojiGlyph() dove metadataVersion è il valore per EDITOR_INFO_METAVERSION_KEY, per verificare se l'app può visualizzare un'emoji specifica.

Utilizzare EmojiCompat con widget personalizzati

Puoi sempre usare l'process() per pre-elaborare CharSequence nella tua app e aggiungere a qualsiasi widget in grado di eseguire il rendering di istanze Spanned; della esempio, TextView. Inoltre, EmojiCompat fornisce il seguente widget per arricchire i tuoi widget personalizzati con il supporto delle emoji il minimo sforzo.

Visualizzazione di testo di esempio

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() {
       ...
   }
}
EditText di esempio

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() {
       ...
   }
}

Domande frequenti

  • Come si avvia il download del carattere?
  • I caratteri emoji vengono scaricati alla prima richiesta, se non esistono sul dispositivo. La pianificazione dei download è trasparente per l'app.

  • Quanto tempo richiede l'inizializzazione? .
  • Dopo aver scaricato il carattere, sono necessari circa 150 millisecondi per inizializzare EmojiCompat.

  • Quanta memoria supporta la libreria EmojiCompat?
  • Al momento, la struttura dei dati per trovare l'emoji è caricata nell'app memoria e utilizza circa 200 kB.

  • Posso utilizzare EmojiCompat per una visualizzazione di testo personalizzata?
  • Sì. EmojiCompat fornisce classi di supporto per widget personalizzati. È inoltre possibile possibile pre-elaborare una determinata stringa e convertirla in Spanned. Per ulteriori informazioni sull'helper per i widget consulta le Utilizzare EmojiCompat con i widget personalizzati .

  • Cosa succede se aggiungo widget nei file XML di layout su dispositivi che vengono eseguiti su Android 4.4 (livello API 19) o versioni precedenti?
  • Puoi includere EmojiCompat supportano la libreria o i relativi widget nelle applicazioni che supportano i dispositivi con Android 4.4 (livello API 19) o versioni precedenti. Tuttavia, se un dispositivo esegue su una versione di Android precedente al livello API 19, EmojiCompat e i suoi widget si trovano in un "nessuna operazione" stato. Ciò significa che Il comportamento di EmojiTextView è esatto come un normale TextView. EmojiCompat istanza; immediatamente entra in un LOAD_STATE_SUCCEEDED lo stato desiderato quando richiami init() .

Risorse aggiuntive

Per ulteriori informazioni sull'uso del EmojiCompat nella raccolta, guarda EmojiCompat.