EmojiCompat の導入と問題とか

背景

DroidKaigi のセッションから気づき、アプリで実際試してみたところ
絵文字が化けて表示されてた(☐)ので直したい

解決方法としては EmojiCompat を使えば大丈夫とのことだった developer.android.com

以下は EmojiCompat を使おうとした時の問題と解決法

アプリのサイズでかくなる問題

EmojiCompatって emoji-appcompatemoji-bundled のどっちか両方かで使えるけど
最初、emoji-bundled を追加したらアプリのサイズが MB 単位で増えてしまったのでやめた(こっちは絵文字データ自体をアプリに入れて使う感じだった)
なので emoji-appcompat でアプリサイズ増やさずにダウンロードして使う方針で解決

初期化問題

EmojiCompatは 初期化(initialize)せずに使うとアプリが落ちるので要注意
使うたびに初期化定義する必要はないので Application クラスに定義しておくと全画面で EmojiCompat 使えるようになる
しかし java.lang.IllegalStateException: Not initialized yet というクラッシュが起きる場合があるので(epoxyの問題かも…謎)
使ってる箇所で try catch してあげないといけなくなってしまった…(これ用のクラス作って使うのが便利)

TextView や EditText の CustomView で使いたい問題

TextView や EditText の CustomView があり、そこに EmojiCompat を反映させたい時
TextView の場合は CustomView 内や外の setText してるところで EmojiCompat.get().process("表示される文字&絵文字") すればよし
EditText の場合は EmojiCompat 用 CustomView をもう一個作って(AppCompatEditText や EditText を継承)
それを自作の CustomView に継承させる感じ
EmojiCompat 用の CustomView は必要なコードがあってここを参考に作れる
developer.android.com

override した setKeyListener() と onCreateInputConnection() で EmojiEditTextHelper というのを使う必要があった

Android 8, 8.1 での ArrayIndexOutOfBoundsException 問題

元からこういう記事があり → http://nyanyoni.hateblo.jp/entry/2018/05/23/000000
まさに起きていたので(まだgoogleで直してなさそう)EditText で使う場合バージョンを指定しておく処理を入れないと行けなくなった
CustomView の場合はこんな感じ

init {
   if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O || Build.VERSION.SDK_INT == Build.VERSION_CODES.O_MR1) {
      this.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
   }
}

これでなんとなく EmojiCompat 対応はできるはず!