Infinito Nirone 7

白羽の矢を刺すスタイル

RTL かどうかを判定する

RTL(Right To Left; アラビア語などの右から左へテキスト等をレイアウトする必要のある環境)対応にはいくつかのステップがあります。

単にレイアウトの属性を RTL に対応したもの(gravity や margin、padding や RelativeLayout の各種属性を Left/Right ではなく Start/End)にするだけでも多くの範囲をカバーすることができます。 Drawable resource については Kitkat から autoMirrored という属性が増えました。これを使うことで RTL 向けの画像を作らずとも自動で反転処理をしてくれるようになります。

ここまででおおよそ RTL 対応ができていそうな気がしますが、もう一つ大事な要素があります。それは自分で View をカスタマイズしている場合に必要な対応です。 レイアウト処理を自分で書いたり、Canvas による描画を自分で書いたりなど、様々なカスタマイズの方法があるとおもいますが、ここで LTR(Left To Right; 左から右へテキスト等をレイアウトする環境) を前提にしたコードを書いていると、RTL な環境でうまく動かなくなります。

RTL 環境での処理を LTR と分ける必要がある場合には、Configuration#getLayoutDirectionを使います。ただしこのメソッドは Jelly Bean MR1 からしか使えないため、それ以前のバージョンをサポートするにあたってはサポートライブラリのViewCompat#getLayoutDirectionを使います。帰ってきた値をViewCompat.LAYOUT_DIRECTION_RTLと比較することで、RTL かどうかを判定します。