Android の TextView の欧文フォントを指定した場合に日本語は表示できるのか検証する
Android の TextView の欧文フォントを指定した場合に日本語は表示できるのか検証する
はじめに
Android では TextView
でテキストを表示しますが TextView
のフォントはandroid:fontFamily
で変更できるようになっています。
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/font_file"
android:textFontWeight="400"
android:textSize="16sp"
android:text="abcdefg1234567890"/>
例えばandroid:fontFamily
に欧文フォントを指定したときに日本語を表示できるのか気になったので検証してみました。
欧文フォントを指定した場合に日本語を表示できるのか?
欧文フォントを指定したときに日本語を表示できるのか検証してみます。
今回は欧文フォント として Roboto を指定して日本語を表示してみようと思います。
Roboto は Google フォントからダウンロードできますが以下のような見た目です。
もちろん欧文フォントなのでRoboto フォントには日本語含まれていません。
例えば Google Font で日本語を表示しようとすると□(豆腐)が表示されます。
Roboto フォントでアルファベットと日本語を表示する TextView で動作確認してみます。
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Robotoを設定した場合"
android:textColor="@color/purple_200"
android:textSize="12sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/roboto_medium"
android:text="abcdefg1234567890"
android:textFontWeight="400"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/roboto_medium"
android:text="あいうえおかきくけこさしすせそ"
android:textFontWeight="400"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/roboto_medium"
android:text="abcdefg1234567890あいうえおかきくけこさしすせそ"
android:textFontWeight="400"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Robotoを設定し、Weightを800にした場合"
android:textColor="@color/purple_200"
android:textSize="12sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/roboto_medium"
android:text="abcdefg1234567890"
android:textFontWeight="700"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/roboto_medium"
android:text="あいうえおかきくけこさしすせそ"
android:textFontWeight="700"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/roboto_medium"
android:text="abcdefg1234567890あいうえおかきくけこさしすせそ"
android:textFontWeight="700"
android:textSize="16sp" />
</LinearLayout>
</ScrollView>
Roboto をフォントに設定していますが日本語が □(豆腐)にはならず問題なく表示されます。
どうやら Android では欧文フォントを設定したときに日本語が表示されても□(豆腐)にならないようによしなに制御してくれるようです。
日本語で表示されている部分は何フォントになるのか?
どうやら日本語で表示されている部分はシステムフォントが適用されるようです。
例えば Android 12 の日本語のシステムフォントは Noto SansCJK JP が採用されています。
// Android 12 のシステムフォントが定義されているソースコード
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/data/fonts/fonts.xml?q=fonts.xml&ss=android%2Fplatform%2Fsuperproject
<family lang="ja">
<font weight="400" style="normal" index="0" postScriptName="NotoSansCJKjp-Regular">
NotoSansCJK-Regular.ttc
</font>
<font weight="400" style="normal" index="0" fallbackFor="serif"
postScriptName="NotoSerifCJKjp-Regular">NotoSerifCJK-Regular.ttc
</font>
</family>
そのため欧文フォント(Roboto)を指定したときの日本語はNoto Sans CJK JP で表示されます。
本当にそうなっているか実際に表示された文字とフォントの文字を比較してみましたが一致したのでシステムフォントが日本語が表示されているようです。
おわりに
Android の TextView の欧文フォントを指定した以下のような動作になる。
- 欧文フォントにはない文字(日本語など)はシステムフォントで表示される
- Android 12 では日本語のシステムフォントは Noto Sans CJK JP である。
Discussion