EmojiCompat の導入と問題とか
背景
DroidKaigi のセッションから気づき、アプリで実際試してみたところ
絵文字が化けて表示されてた(☐)ので直したい
解決方法としては EmojiCompat を使えば大丈夫とのことだった developer.android.com
以下は EmojiCompat を使おうとした時の問題と解決法
アプリのサイズでかくなる問題
EmojiCompatって emoji-appcompat
と emoji-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 対応はできるはず!